如何修改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中
修改約束值失敗的問題了!