ios xib和程式碼的frame佈局 iOSXib佈局後代碼修改約束的值
阿新 • • 發佈:2019-01-07
如何修改autolayout 約束的值?
1 2 3 4 5 6 |
目前我已知的方法有 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:
程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//
// 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的寬高我們設定的是一樣的:
當我們把註釋開啟時:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//
// 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!
可以說明的是,每一個
1 |
NSLayoutConstraint的物件,都有 constant 值,我們 拖拽到程式碼中可以直接改變其值,也不會產生任何警告和衝突!
|
1 |
但是,這還沒完,你在開發時可能會遇到,在 viewDidLoad中修改 過 constant值,或者修改其他約束的值,卻沒有產生任何效果:
|
1 |
這是因為 :你在storyboard設定的約束是這樣處理的 : 你在 viewDidLoad中修改的約束的程式碼塊運行了,但是 執行完之後 又被 storyboard自己的配置給覆蓋了,所以 你看到的還是你之前設定的約束!
|
1 |
解決辦法: 讓修改 constant值或者約束的語句延遲執行即可!即使是
0.1 秒,也能讓 在storyboard初始完成之後你再修改相應的約束,這樣就不會被覆蓋掉了!
|
1 |
具體方法:見程式碼
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//
// 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
1 |