iOSXib布局后用代碼修改約束的值

如何修改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種方法:
直接修改約束的值,這是最直接最簡單,也是官方推薦的方法!比移除約束再添加約束省事不少!

首先咱們來拖拽一個viewviewController上,設(shè)置好上左寬高的值,確定view的位置:
效果和約束值如下:


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

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

如何拖拽?


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

拖拽效果:


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

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


下面我們來修改,這個viewtop上邊界的,和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中修改約束值失敗的問題了!

參考:
http://www.cnblogs.com/xiaoxiaoyublogs/p/5863890.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,422評論 4 61
  • 來個大整容 app在橫屏狀態(tài)下是不顯示iPhone的狀態(tài)欄的(就是有個小電池的那一欄),除非你強制app這樣做。這...
    Billionfan閱讀 4,301評論 8 9
  • (嚴(yán)肅微笑臉)女人穿得少不應(yīng)該成為男人犯罪的理由。難不成為了不成為強盜犯罪的理由,富人還不能蓋豪宅? 富人敢住豪宅...
    去社閱讀 147評論 2 0
  • 她的嘴角 還有殘留的胡渣 她的腿毛 還是有點濃密 屁股扁平 乳房很假但也很挺 足夠愉悅她的男人們 他還是沒有 完全...
    向日葵愛呀愛太陽閱讀 192評論 0 0

友情鏈接更多精彩內(nèi)容