如何修改autolayout約束的值?
目前我已知的方法有5種
- 1、修改
frame(有時候可能會不起作用,但可以做動畫) - 2、修改約束的
float值 - 3、使用
VisualFormat語言 - 4、使用
constraintWithItem,按倍率改變 如 2x+1=Y - 5、移除約束
remove at runtime,添加新的約束
在實際的開發(fā)中我們經(jīng)常需要適配不同的屏幕尺寸和系統(tǒng)版本,這時我們就需要用代碼對我們的布局進行適當(dāng)?shù)恼{(diào)整
下面介紹下第2種方法:
直接修改約束的值,這是最直接最簡單,也是官方推薦的方法!比移除約束再添加約束省事不少!
首先咱們來拖拽一個view到viewController上,設(shè)置好上左寬高的值,確定view的位置:
效果和約束值如下:

可以看出,約束是:距離左邊 10,上邊 61,寬高為117、111
我們對圖中的ViewController綁定類之后,拖拽幾個約束到綁定的ViewController類的延展中去:
如何拖拽?

我們試著拖拽左邊約束和高度約束到viewcontroller.m的延展中去
拖拽效果:

拖拽過程中會產(chǎn)生一條線,松手后需要你給這outlet填寫一個名詞,點擊connect或者回車,代碼中就有啦!

原拖拽成功的最終在代碼中的效果是:

下面我們來修改,這個view的top上邊界的,和view的高度,使其都增加100:
代碼如下:
//
// ViewController.m
// SizeClass
//
// Created by http://blog.csdn.net/yangbingbinga 15/1/21.
// Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga All rights reserved.
//
#import ViewController.h
@interface ViewController ()
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *top;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *height;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// self.top.constant+=100;
// self.height.constant+=100;
}
@end
當(dāng)我們注釋這段代碼的時候,運行的效果是這個樣子的:

可以看到,這個view的寬高我們設(shè)置的是一樣的:
當(dāng)我們把注釋打開時:
//
// ViewController.m
// SizeClass
//
// Created by http://blog.csdn.net/yangbingbinga 15/1/21.
// Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga All rights reserved.
//
#import ViewController.h
@interface ViewController ()
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *top;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *height;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.top.constant+=100;
self.height.constant+=100;
}
@end
運行效果如下:

可以看到top的值和之前比增加了100,高度也增加了100!
可以說明的是,每一個NSLayoutConstraint的對象都有constant值,我們拖拽到代碼中可以直接改變其值,也不會產(chǎn)生任何警告和沖突!
但是,這還沒完,你在開發(fā)時可能會遇到,在viewDidLoad中修改過constant值,或者修改其他約束的值,卻沒有產(chǎn)生任何效果:
這是因為:你在storyboard設(shè)置的約束是這樣處理的:你在 viewDidLoad中修改的約束的代碼塊運行了,但是運行完之后又被 storyboard自己的配置給覆蓋了,所以你看到的還是你之前設(shè)置的約束!
解決辦法:讓修改constant值或者約束的語句延遲執(zhí)行即可!即使是0.1秒,也能讓在storyboard初始完成之后你再修改相應(yīng)的約束,這樣就不會被覆蓋掉了!
具體方法:見代碼
//
// ViewController.m
// SizeClass
//
// Created by http://blog.csdn.net/yangbingbinga 15/1/21.
// Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga All rights reserved.
#import ViewController.h
@interface ViewController ()
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *top;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *height;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self performSelector:@selector(modifyConstant) withObject:nil afterDelay:0.1];//延遲加載,執(zhí)行
//modifyConstant,0.1秒之后再 改變約束值!
}
- (void)modifyConstant//把修改的代碼放在一個方法里!
{
self.top.constant+=100;
self.height.constant+=100;}
}
@end
這樣就可以解決在viewDidLoad中修改約束值失敗的問題了!