Autolayout修改約束

修改autolayout 約束atom

 

修改控件的位置有5種方法  :spa

1.修改frame  .net

2.修改約束的constant值  orm

3.使用VisualFormat 語言  對象

4.使用 constraintWithItem方法,按倍率改變   如  2x+1=Y   開發

5.移除約束(remove at runtime),添加新的約束  rem

 

下面說說直接修改 約束的值 ,這是最直接最簡單,官方推薦的方法!比移除 約束再添加約束省事很多! 拖拽一個 view到 viewController上,設置好 上左寬高的值,肯定 view的位置:get

效果 和約束值以下:it

能夠看出,約束是: 距離左邊  10,上邊 61,寬高未117,111io

咱們對圖中的ViewController綁定類以後,拖拽 幾個約束到  綁定的ViewController類的 延展中去:

如何 拖拽?:

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

拖拽效果:

拖拽過程當中會產生一條線,鬆手後須要你給這  outlet填寫一個名詞,點擊connect或者回車 ,代碼中就有 啦!

 

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

下面來修改  ,這個view的  top上邊界的,和 view的高度,使其都增長100:

代碼以下:

 

#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 值,咱們 拖拽到代碼中能夠直接改變其值,也不會產生任何警告和衝突!  

可是,這還沒完,你在開發時可能會遇到,在 viewDidLoad中修改 過  constant值,或者修改其餘約束的值,卻沒有產生任何效果:  

這是由於  :你在storyboard設置的約束是這樣處理的  :  你在 viewDidLoad中修改的約束的代碼塊運行了,可是 運行完以後 又被 storyboard本身的配置給覆蓋了,因此 你看到的仍是你以前設置的約束!  

解決辦法: 讓修改  constant值或者約束的語句延遲執行便可!即便是 0.1秒,也能讓 在storyboard初始完成以後你再修改相應的約束,這樣就不會被覆蓋掉了!  

解決代碼:  

#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];//延遲加載,

}

 

 

- (void)modifyConstant{

    

    self.top.constant+=100; self.height.constant+=100;

}

 

@end

 

這樣就能夠解決在 viewDidLoad中 修改  約束值失敗的問題了!

相關文章
相關標籤/搜索