天天看點

iOS AutoLayout自動布局修改限制的值,延遲加載

如何修改autolayout 限制的值?

?

1 2 3 4 5 6

<span style=

"font-family:SimSun;"

>目前我已知的方法有

5

1

.修改frame(有時候可能會不起作用,但可以做動畫)

2

.修改限制的

float

3

.使用VisualFormat 語言

4

.使用 constraintWithItem,按倍率改變   如  2x+

1

=Y 

5

.移除限制(remove at runtime),添加新的限制</span>

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

先來介紹第2種方法:

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

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

效果和限制值如下:

iOS AutoLayout自動布局修改限制的值,延遲加載

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

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

如何拖拽?:

iOS AutoLayout自動布局修改限制的值,延遲加載

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

拖拽效果:

iOS AutoLayout自動布局修改限制的值,延遲加載
拖拽過程中會産生一條線,松手後需要你給這 outlet填寫一個名詞,點選connect或者回車 ,代碼中就有啦!
iOS AutoLayout自動布局修改限制的值,延遲加載
原拖拽成功的最終在代碼中的效果是:
iOS AutoLayout自動布局修改限制的值,延遲加載

下面我們來修改 ,這個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

當我們注釋 這段 代碼的時候,運作的效果是這個樣子的:
iOS AutoLayout自動布局修改限制的值,延遲加載

可以看到,這個 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

運作效果如下:
iOS AutoLayout自動布局修改限制的值,延遲加載

可以看到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
?
1

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

轉自:http://www.2cto.com/kf/201501/372447.html