iOS AutoLayout自动布局中级开发教程(5)-修改约束的值,延迟加载

如何修改autolayout 约束的值?

<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的位置:

效果 和约束值如下:

可以看出,约束是: 距离左边  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];//延迟加载,执行<pre name="code" class="cpp" style="font-size: 14px; line-height: 26px;">modifyConstant,0.1秒之后再 改变约束值!

}- (void)modifyConstant//把修改的代码放在一个房里里!{ self.top.constant+=100; self.height.constant+=100;}@end



这样就可以解决在 viewDidLoad中 修改  约束值失败的问题了!

如有更多疑问,欢迎一起探讨!  原文地址 http://blog.csdn.net/yangbingbinga

时间: 2024-12-19 07:03:12

iOS AutoLayout自动布局中级开发教程(5)-修改约束的值,延迟加载的相关文章

iOS AutoLayout自动布局中级开发教程(2)-初识autolayout

通过storyboard,我们初识一下autolayout的表现形式: 看下图,使用storyboard创建的两个控件视图: 上图中的四个圆角框内的距离值,就是约束; 比如上图的第二个视图,他的 约束是:  距离 view左边,右边界的距离,这样就确定了 宽度和水平方向上的位置,还有距离上面(第一个)视图的距离,还有高,这样就确定了 视图的高度和y轴的位置;这样就可以在一个二维空间(屏幕)中唯一的确定这个视图的位置了; 但是,需要注意的,在添加距离上一个视图下边界的约束时,第一个视图的位置一定要

iOS AutoLayout自动布局中级开发教程(1)-浅谈autolayout

何为autoLayout(自动布局,相对布局)? 按照我粗浅的理解,autolayout就是描述用来描述视图(控件)与视图之间的关系的一种工具; 当然,这种关系包括,子视图与子视图(如一个view上的两个button),子视图与父视图的关系(如一个Button距离他的父视图view右边界的距离);有大小关系(等高等宽),边界距离关系,有中心点(centerX 和 centerY)关系也有比例缩放(ratio)关系; autolayout的原理实际上是基于数学的一次方程求解,最终算出 约束值;按照

iOS AutoLayout自动布局中级开发教程(3)-等宽等高等中心

前面讲到了一些关于边界约束的知识,但那些基础知识来解决一些实际问题还是会有点力不从心的;所以我们需要更高级的设置约束的办法,设置等高等宽等中心: 见下图: 图中有3个button按钮, 现在要求3个button等宽,等高 , 且 垂直中心在一条线上,这该如何设置? 按照前面的说法,约束其实是一次方程组的求解,那么 通过观察可以得之,如果我们设置好了button之间的左右边界约束,然后再让3个button等宽就可以; 那么就会有  3x  = 宽度; 所以 每一个Button的宽度就可以计算出来了

iOS AutoLayout自动布局中级开发教程(4)-label等文字自动适应大小,宽度

相比大家会经常遇到  label  或则  textfield等显示文字的  视图时,显示不全,或者无法自动 变化长度  ,自动改变字体的 设置: 今天给大家演示一下,如何 在autolayout让label 适应 不同的 宽度: 1.自动 改变字体: 首先设置好 label 的约束,包括宽高之后,默认来看 你的  label是不变了 ,但是 当遇到 文字较多时,就会出现显示不全的问题: 如图,我们设置好 Label的宽度和高度,和其他约束,固定住 label, 这是我们增加label的字数..

iOS AutoLayout自动布局中级开发教程(7)-底部顶部baseLine基线对齐

如何对多个view或者Button添加底部对齐顶部对齐等等类似的对齐约束呢?最简单的方法使用 storyboard,在后续的教程中将使用代码实现. 如下图,如何为这两个或者多个视图添加 底部对齐呢? (或者顶部对齐,左对齐,右对齐,基线baseLine对齐?) 首先说明一下对齐的实质: 顶部或者底部对齐: 本质上就确定了 一个视图的y坐标 左边或者右边对齐:本质上确定了一个视图的x坐标 centerX/Y对齐:确定 x/y坐标 注意对齐的前提是要 这其中的一个的顶部(或者底部,等等)约束已经确定

ios xib和代码的frame布局 iOSXib布局后代码修改约束的值

如何修改autolayout 约束的值? 1 2 3 4 5 6 目前我已知的方法有5种 1.修改frame(有时候可能会不起作用,但可以做动画) 2.修改约束的float值 3.使用VisualFormat 语言 4.使用 constraintWithItem,按倍率改变   如  2x+1=Y  5.移除约束(remove at runtime),添加新的约束 前面的文章已经讲到如何使用storyboard 创建约束了,但是在实际的开发中我们经常需要适配不同的屏幕尺寸和系统版本,这时我们就

柳峰微信公众平台开发教程企业号修改篇(AES验证)

本文针对<微信公众平台应用开发:方法.技巧与案例> 一书中示例和代码不适用于微信企业号的情况进行修改. 修改原因: 企业在接收消息,以及发送被动响应消息时,消息体都以AES方式加密,以保证传输的安全 修改方法: 按照微信加密库进行加密验证,具体加密库下载地点请参考开发人员文档,这里不再叙述 注意事项: 异常java.security.InvalidKeyException:illegal Key Size 需要去Oracle官方网站下载JCE无限制权限策略文件,分JDK6 JDK7 JDK8,

Python中级开发教程

Python中级教程索引: 第一课.数据类型                      第十课.图形界面(下) 第二课.再讲数据类型                  第十一课.剪刀石头布游戏与随机函数 第三课.文本处理与色彩(上)             第十二课.获取手机系统信息(上) 第三课.文本处理与色彩(下)             第十二课.获取手机系统信息(下) 第四课.文件操作                      第十三课.选项卡(折叠界面) 第五课.while循环    

iOS Touch ID 简易开发教程

转自:NsstringFromName 支持系统和机型 iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用. 依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthentication.h> 注意事项 做iOS 8以下版本适配时,务必进行API验证,避免调