iOS AutoLayout自動布局中級開發教程(5)-修改約束的值,消極式載入

來源:互聯網
上載者:User

iOS AutoLayout自動布局中級開發教程(5)-修改約束的值,消極式載入

如何修改autolayout 約束的值?

 

目前我已知的方法有5種1.修改frame(有時候可能會不起作用,但可以做動畫)2.修改約束的float值3.使用VisualFormat 語言4.使用 constraintWithItem,按倍率改變   如  2x+1=Y 5.移除約束(remove at runtime),添加新的約束

前面的文章已經講到如何使用storyboard 建立約束了,但是在實際的開發中我們經常需要適配不同的螢幕尺寸和系統版本,這時我們就 需要用代碼對 我們的布局進行適當的調整了,

先來介紹第2種方法:

直接修改 約束的值 ,這是最直接最簡單,官方推薦的方法!比移除 約束再添加約束省事不少!

首先咱們來拖拽一個 view到 viewController上,設定好 上左寬高的值,確定 view的位置:

效果 和約束值如下:

可以看出,約束是: 距離左邊 10,上邊 61,寬高未117,111

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

如何 拖拽?:

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

拖拽效果:

拖拽過程中會產生一條線,鬆手後需要你給這 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
當我們注釋 這段 代碼的時候,啟動並執行效果是這個樣子的:

 


 

可以看到,這個 view的寬高我們設定的是一樣的:

當我們把注釋開啟時:

 

////  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 值,我們 拖拽到代碼中可以直接改變其值,也不會產生任何警告和衝突!
但是,這還沒完,你在開發時可能會遇到,在 viewDidLoad中修改 過  constant值,或者修改其他約束的值,卻沒有產生任何效果:
這是因為  :你在storyboard設定的約束是這樣處理的  :  你在 viewDidLoad中修改的約束的代碼塊運行了,但是 運行完之後 又被 storyboard自己的配置給覆蓋了,所以 你看到的還是你之前設定的約束!
解決辦法: 讓修改  constant值或者約束的語句順延強制即可!即使是 0.1秒,也能讓 在storyboard初始完成之後你再修改相應的約束,這樣就不會被覆蓋掉了!
具體方法:見代碼

 

 

////  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];//消極式載入,執行
modifyConstant,0.1秒之後再 改變約束值!
}- (void)modifyConstant//把修改的代碼放在一個房裡裡!{ self.top.constant+=100; self.height.constant+=100;}@end

 


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

 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.