iOS界面布局之三——纯代码的autoLayout及布局动画(二)

简介: iOS界面布局之三——纯代码的autoLayout及布局动画(一)

       那么我们先来看,什么是格式化的字符串约束。


       说到格式化的字符串约束,要先提一个东西VFL:visual format language——格式化约束语言,这又是什么鬼?确实,这个东西写出来第一眼看上去真的不知道是什么鬼,就比如要设置一个label,距离上边100,左边20,宽高都为100,代码如下:


label.numberOfLines = 0;

   label.translatesAutoresizingMaskIntoConstraints = NO;

   label.backgroundColor = [UIColor redColor];

 

   //label.text=@"12332322132131233213213";

     [self.view addSubview:label];

   NSArray * constraintArray = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[label(100@1000)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)];

   NSArray * constraintArray2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[label(100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)];

   [self.view addConstraints:constraintArray];

   [self.view addConstraints:constraintArray2];

效果如下:


image.png


代码少了很多,对吧,但是中间那部分字符串什么玩意?下面我们来解释一下。


       VFL语言我个人而言,他很类似于古代的象形文字(不知道是否apple的工程师从其中得到灵感),对布局的约束设置是直观的用符号表达出来的,例如:


H:|-20-[label(100@1000)]

前面的H代表是水平的布局还是垂直的布局,H代表水平,V表示垂直,|表示父视图的边沿,-20-表示距离20px,[]内是要布局摆放的视图对象名,()中是约束的尺寸,H下则为宽度,V下则为高度,@后面的数字代表优先级。


创建方法中的options参数,用来设置对齐模式,不需要可以写0:


typedef NS_OPTIONS(NSUInteger, NSLayoutFormatOptions) {

   NSLayoutFormatAlignAllLeft = (1 << NSLayoutAttributeLeft),

   NSLayoutFormatAlignAllRight = (1 << NSLayoutAttributeRight),

   NSLayoutFormatAlignAllTop = (1 << NSLayoutAttributeTop),

   NSLayoutFormatAlignAllBottom = (1 << NSLayoutAttributeBottom),

   NSLayoutFormatAlignAllLeading = (1 << NSLayoutAttributeLeading),

   NSLayoutFormatAlignAllTrailing = (1 << NSLayoutAttributeTrailing),

   NSLayoutFormatAlignAllCenterX = (1 << NSLayoutAttributeCenterX),

   NSLayoutFormatAlignAllCenterY = (1 << NSLayoutAttributeCenterY),

   NSLayoutFormatAlignAllBaseline = (1 << NSLayoutAttributeBaseline),

   NSLayoutFormatAlignAllLastBaseline = NSLayoutFormatAlignAllBaseline,

   NSLayoutFormatAlignAllFirstBaseline NS_ENUM_AVAILABLE_IOS(8_0) = (1 << NSLayoutAttributeFirstBaseline),

 

   NSLayoutFormatAlignmentMask = 0xFFFF,

 

   /* choose only one of these three

    */

   NSLayoutFormatDirectionLeadingToTrailing = 0 << 16, // default

   NSLayoutFormatDirectionLeftToRight = 1 << 16,

   NSLayoutFormatDirectionRightToLeft = 2 << 16,  

 

   NSLayoutFormatDirectionMask = 0x3 << 16,  

};

metrics参数是属性替换字典,例如我们上边用到的距离左边界20,如果这个20是一个变量width,我们可以将20的地方换成width,然后配置这个字典:@{@"width":@20},这样,在布局时,系统会把width换成20。


views是对象的映射字典,原理也是将字符串中的对象名label映射成真实的对象,NSDictionaryOfVariableBindings会帮我们生成这样的字典,我们只需要想对象传进去即可,如果要手动创建这字典,格式如下:@{@"label":label}.


三、使用aotulayout设计一个聊天界面的输入框


       仔细观察QQ或者其他聊天工具的app上的输入框,会发现他非常智能,宽度会随着我们输入文字的行数进行自适应,并且这个宽度不是无限增大的,当我们文字多到一定行数,宽度会保持不变,文本框可以进行内容滑动,如果不用autolayout,这个功能会比较棘手一些,但是使用它,会发现这是如此的容易:


@interface ViewController ()<UITextViewDelegate>

{

   UITextView * textView ;

   NSArray * array1;

   NSArray * array2;

}

@end


@implementation ViewController


- (void)viewDidLoad {

   [super viewDidLoad];

   // Do any additional setup after loading the view, typically from a nib.

 

 

   textView = [[UITextView alloc]init];

   textView.layer.borderColor = [[UIColor grayColor]CGColor];

   textView.layer.borderWidth = 1;

   textView.translatesAutoresizingMaskIntoConstraints = NO;

   textView.delegate=self;

   [self.view addSubview:textView];

   array1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[textView]-100-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(textView)];

   array2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[textView(30)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(textView)];

   [self.view addConstraints:array1];

   [self.view addConstraints:array2];

 

}


-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

   //当文本高度大于textView的高度并且小于100时,更新约束

   if (textView.contentSize.height>textView.frame.size.height&&textView.contentSize.height<100) {

       float hight =textView.contentSize.height;

       //将以前的移除掉

       [self.view removeConstraints:array1];

       [self.view removeConstraints:array2];

       array1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[textView]-100-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(textView)];

       array2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[textView(hight)]" options:0 metrics:@{@"hight":[NSNumber numberWithFloat:hight]} views:NSDictionaryOfVariableBindings(textView)];

       [self.view addConstraints:array1];

       [self.view addConstraints:array2];

   }

   //更新约束

   [self.view updateConstraintsIfNeeded];

   return YES;

}

现在,当我们进行输入的时候,textView的高度可以自适应文字行数了。


四、通过动画改善更新约束时的效果


       这一点非常coll,上面我们已经实现了textView随文本的行数高度进行自适应,但是变化的效果十分生硬,还要apple的动画框架支持autolayout,把刚才调用更新约束的地方进行如下修改:


[UIView animateWithDuration:1 animations:^{

       [self.view layoutIfNeeded];

   }];

试试看,变换的效果已经非常平滑了。

目录
相关文章
|
iOS开发
iOS 动画绘制圆形
iOS 动画绘制圆形
93 1
|
编译器 iOS开发 异构计算
读iOS核心动画笔记
读iOS核心动画笔记
65 0
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
34 2
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
62 1
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
63 5
|
4月前
|
安全 iOS开发
iOS页面布局:UIScrollView的布局问题
iOS页面布局:UIScrollView的布局问题
73 8
|
4月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
74 11
|
5月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
61 7
|
5月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
117 0
|
7月前
|
编解码 安全 Android开发
探索iOS与Android开发的差异:从界面到性能
【6月更文挑战第10天】在移动应用开发的广阔天地中,iOS和Android两大平台各占山头,它们在设计理念、用户体验、性能优化等方面展现出独特的魅力。本文将深入探讨这两大系统在开发过程中的主要差异,从用户界面设计到性能调优,揭示各自背后的技术逻辑与创新策略,为开发者提供全面的视角和实用的开发指南。