在代码中使用Autolayout (1) – 按比例缩放和优先级

首先说按比例缩放,这是在Interface Builder中无法设置的内容。而在代码中,使用NSLayoutConstraint类型的初始化函数中的multiplier参数就可以非常简单的设置按比例缩放。同时也可以设置不同NSLayoutAttribute参数来达到意想不到的效果,比如“A的Width等于B的Height的2倍”这样的效果。

OK,开始写代码,我们就拿一个简单的UIButton做示例,在ViewController中创建一个UIButton字段:

UIButton *btn;

命令这个Button水平居中,始终距离父View底部20单位的距离。然后高度是父View高度的三分之一。

最后使用KVO来监控Button的大小并实时输出到屏幕上。

代码:

- (void)viewDidLoad{    [super viewDidLoad];

    //创建UIButton,不需要设置frame    btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];    [btn setTitle:@"mgen" forState:UIControlStateNormal];    btn.backgroundColor = [UIColor greenColor];    [self.view addSubview:btn];

    //禁止自动转换AutoresizingMask    btn.translatesAutoresizingMaskIntoConstraints = NO;

    //居中    [self.view addConstraint:[NSLayoutConstraint                              constraintWithItem:btn                              attribute:NSLayoutAttributeCenterX                              relatedBy:NSLayoutRelationEqual                              toItem:self.view                              attribute:NSLayoutAttributeCenterX                              multiplier:1                              constant:0]];

    //距离底部20单位    //注意NSLayoutConstraint创建的constant是加在toItem参数的,所以需要-20。    [self.view addConstraint:[NSLayoutConstraint                              constraintWithItem:btn                              attribute:NSLayoutAttributeBottom                              relatedBy:NSLayoutRelationEqual                              toItem:self.view                              attribute:NSLayoutAttributeBottom                              multiplier:1                              constant:-20]];

    //定义高度是父View的三分之一    [self.view addConstraint:[NSLayoutConstraint                              constraintWithItem:btn                              attribute:NSLayoutAttributeHeight                              relatedBy:NSLayoutRelationEqual                              toItem:self.view                              attribute:NSLayoutAttributeHeight                              multiplier:0.3                              constant:0]];

    //注册KVO方法    [btn addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:nil];    }

//KVO回调- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if (object == btn && [keyPath isEqualToString:@"bounds"])    {        [btn setTitle:NSStringFromCGSize(btn.bounds.size) forState:UIControlStateNormal];    }}

运行结果:

 

OK,没有任何问题。

接下来有一个新的需求,在横向的显示中,Button的高度只有96,觉得他太短了,所以要求Button的最小高度为150。

这样的话,需要加入另一个限制大小的Constraint,但是这两个Constraint在某些情况下是有冲突的,我们可以通过设置Constraint的优先级来解决。优先级对应NSLayoutConstraint类型的priority属性,默认值是UILayoutPriorityRequired,数值上等于1000. 设置一个低的值代表更低的优先级。

另外对于最小值的定义,使用NSLayoutRelationGreaterThanOrEqual作为NSLayoutConstraint类型创建时的relatedBy参数。

修改上面的比例Constraint,并在下方加入一个新的限制最小值的Constraint,代码:

//定义高度是父View的三分之一//设置优先级低于UILayoutPriorityRequired(1000),UILayoutPriorityDefaultHigh是750NSLayoutConstraint *con = [NSLayoutConstraint                          constraintWithItem:btn                          attribute:NSLayoutAttributeHeight                          relatedBy:NSLayoutRelationEqual                          toItem:self.view                          attribute:NSLayoutAttributeHeight                          multiplier:0.3                          constant:0];con.priority = UILayoutPriorityDefaultHigh;[self.view addConstraint:con];

//设置btn最小高度为150[btn addConstraint:[NSLayoutConstraint                    constraintWithItem:btn                    attribute:NSLayoutAttributeHeight                    relatedBy:NSLayoutRelationGreaterThanOrEqual                    toItem:nil                    attribute:NSLayoutAttributeNotAnAttribute                    multiplier:1                    constant:150]];

运行后,横向屏幕中的Button高度成了150:

原文地址:http://www.mgenware.com/blog/?p=490

在代码中使用Autolayout (1) – 按比例缩放和优先级

时间: 2025-01-11 13:20:19

在代码中使用Autolayout (1) – 按比例缩放和优先级的相关文章

在代码中使用Autolayout (2) – intrinsicContentSize和Content Hugging Priority

接上文:iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级. 我们继续来看在代码中使用Autolayout的话题.先说intrinsicContentSize,也就是控件的内置大小.比如UILabel,UIButton等控件,他们都有自己的内置大小.控件的内置大小往往是由控件本身的内容所决定的,比如一个UILabel的文字很长,那么该UILabel的内置大小自然会很长.控件的内置大小可以通过UIView的intrinsicContentSize属性来获取内置大小,也可以通

iOS: 在代码中使用Autolayout (2) – intrinsicContentSize和Content Hugging Priority【转】

原文:http://www.mgenware.com/blog/?p=491 接上文:iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级. 我们继续来看在代码中使用Autolayout的话题.先说intrinsicContentSize,也就是控件的内置大小.比如UILabel,UIButton等控件,他们都有自己的内置大小.控件的内置大小往往是由控件本身的内容所决定的,比如一个UILabel的文字很长,那么该UILabel的内置大小自然会很长.控件的内置大小可以通过UI

iOS: 在代码中使用Autolayout

原理:IOS6.0 之后,苹果优化了UI界面的布局方式,提出了自动布局的概念,和之前的autoresizing相比功能更强大.子视图基于父视图的自动布局显示.都是父视图去添加对子视图的约束. 在这里主要说的是通过代码对自动布局视图的实现. 代码中一般用到的有两个添加约束的方式: 1.- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0); 2.- (void)addConstraints:(NSAr

Android ImageView图片代码实现按屏幕宽度等比例缩放

/** * 设置图片根据屏幕宽度进行等比例缩放 * @param imageView */ public static void setImageMatchScreenWidth(ImageView imageView){ BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable(); if(bitmapDrawable == null) return; Bitmap bitmap = bitmapDrawabl

iOS 在xib或者storyboard中添加AutoLayout后,在代码中修改AutoLayout约束条件

如果是viewControl则AutoLayout适配写在- (void)updateViewConstraints方法中修改约束: 如果是view则AutoLayout适配 则在- (void)updateConstraints方法中修改. 可以直接把视图的约束像拖控件一样拖成属性直接在下面的方法里更改即可 //遍历self.myView控件中的约束,找到NSLayoutAttributeHeight控件高度这个约束关系,然后修改 -(void)updateViewConstraints {

css中如何做到容器按比例缩放

提供一个容器,设置容器的高度为0,再设置padding-bottom为56.25%(因为padding的百分比是按照容器宽度计算的,所以由padding来撑开容器高度,而不是height,保证了容器的宽高比例),最后设置视频绝对定位,其宽高为容器的100% .wrap{ height: 0; padding-bottom: 56.25%; /* 16:9 */ position: relative; width: 100%; } .wrap .video{ position: absolute;

手机Web 开发中图片img 如何等比例缩放

如果图片本身没有设置 width.height属性的话,只需要修改 max-width:100%; 就可以了 如果图片本身设置了 width.height属性的话,需要同时修改width 和height 两种属性, 我的解决办法如下 <style> img { max-width: 100% !important; height: auto !important; }</style> 原文地址:https://www.cnblogs.com/acm-bingzi/p/imgZoom

前端学习代码实例-JavaScript 图片等比例缩放裁切详解

本文将通过代码实例详细介绍一下如何实现图片等比例缩放裁切效果. 图片有两种应用方式,一种作为子元素存在,一种是作为背景图片. 在每一种应用方式中,图片的等比例缩放又可以大致分为如下几种情况: (1).确保图片能够填充满元素,超出的部分被裁切或者隐藏. (2).确保图片的长或者宽填充满元素,超出的部分被裁切或者隐藏. 下面通过代码实例分别介绍一下上述列举的中可能,需要的朋友可以做一下参考. 一.作为背景图片: 通过CSS的background-image属性可以设置元素的背景图片效果. 下面就以如

使用autoLayout布局view,在代码中修改frame解决方案

在xib或者storyBoard中给aView使用autoLayout设定了约束,但是想让aView做一个简单的动画,比如从约束的A位置(0,0,100,100)移动到B位置(0,66,100,100)的简单动画. 那么你会发现,如果在xib或者storyBoard中设定了约束,在代码中直接修改aView的frame行不通的. 实现结果就是在ios7上没问题,但是在ios8上发现aView从A移动到B,但是又返回A(具体差别还没找到) 解决方案: loginViewTopConstraint =