autolayout - sizeClass - Masonry - 3
来源:互联网 发布:java如何一行输出 编辑:程序博客网 时间:2024/05/18 01:05
学习完autolayout和Masonry的基本知识点后,马上编写几个小例子来玩玩:
这个例子取自Protocol - 3 用委托来实现页面间的传值,可以参见那篇文章,例子大概就是在视图上放置一个textView,然后改变textView的内容,我试着用Masonry来达到旋转屏幕(横屏或者竖屏的自适配)
刚开始的代码实现:
第一种:值要适当取得好:
#import "Masonry.h"#import "LBProtoFirstViewController.h"@interface LBProtoFirstViewController ()@property (nonatomic, strong) UITextView* textView;@end@implementation LBProtoFirstViewController- (void)viewDidLoad{ [super viewDidLoad]; UIView* superView = self.view; self.textView = [UITextView new]; self.textView.textColor = [UIColor redColor]; self.textView.font = [UIFont systemFontOfSize:22]; self.textView.backgroundColor = [UIColor lightGrayColor]; self.textView.translatesAutoresizingMaskIntoConstraints = NO; self.textView.text = @"Even with such a simple example the code needed is quite verbose and quickly "; [superView addSubview:self.textView]; UIEdgeInsets padding = UIEdgeInsetsMake(100, 50, 150, 50); [self.textView mas_makeConstraints:^(MASConstraintMaker* make){ make.edges.equalTo(superView).with.insets(padding); }]; }第一种方法如果设置的值不适当的话,当切换成横屏的时候textView会直接消失了,说白了就是写死了。
第二种:在旋转的扩展方法中添加处理(这个处理就是一个update更新)
#import "Masonry.h"#import "LBProtoFirstViewController.h"@interface LBProtoFirstViewController ()@property (nonatomic, strong) UITextView* textView;@end@implementation LBProtoFirstViewController- (void)viewDidLoad{ [super viewDidLoad]; UIView* superView = self.view; self.textView = [UITextView new]; self.textView.textColor = [UIColor redColor]; self.textView.font = [UIFont systemFontOfSize:22]; self.textView.backgroundColor = [UIColor lightGrayColor]; self.textView.translatesAutoresizingMaskIntoConstraints = NO; self.textView.text = @"Even with such a simple example the code needed is quite verbose and quickly "; [superView addSubview:self.textView]; UIEdgeInsets padding = UIEdgeInsetsMake(100, 50, 280, 50); [self.textView mas_makeConstraints:^(MASConstraintMaker* make){ make.edges.equalTo(superView).with.insets(padding); }]; }- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ BOOL isLandScape = NO; UIDeviceOrientation oritation = [UIDevice currentDevice].orientation; isLandScape = ((oritation == UIDeviceOrientationLandscapeLeft) || (oritation == UIDeviceOrientationLandscapeRight)); if (isLandScape) { UIEdgeInsets padding = UIEdgeInsetsMake(20, 50, 50, 50); [self.textView mas_updateConstraints:^(MASConstraintMaker* make){ make.edges.equalTo(self.view).with.insets(padding); }]; } else { UIEdgeInsets padding = UIEdgeInsetsMake(100, 50, 280, 50); [self.textView mas_updateConstraints:^(MASConstraintMaker* make){ make.edges.equalTo(self.view).with.insets(padding); }]; }}- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{}@end
注意如果把处理添加到did方法里会有闪烁的不好的视觉体验。
同理当使用center属性的时候:
#import "Masonry.h"#import "LBProtoFirstViewController.h"@interface LBProtoFirstViewController ()@property (nonatomic, strong) UITextView* textView;@end@implementation LBProtoFirstViewController- (void)viewDidLoad{ [super viewDidLoad]; UIView* superView = self.view; self.textView = [UITextView new]; self.textView.textColor = [UIColor redColor]; self.textView.font = [UIFont systemFontOfSize:22]; self.textView.backgroundColor = [UIColor lightGrayColor]; self.textView.translatesAutoresizingMaskIntoConstraints = NO; self.textView.text = @"Even with such a simple example the code needed is quite verbose and quickly !"; [superView addSubview:self.textView]; [self.textView mas_makeConstraints:^(MASConstraintMaker* make){ make.center.mas_equalTo(superView); make.size.mas_equalTo(CGSizeMake([[UIScreen mainScreen] bounds].size.width - 50, [[UIScreen mainScreen] bounds].size.height - 150)); }]; }- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ BOOL isLandScape = NO; UIDeviceOrientation oritation = [UIDevice currentDevice].orientation; isLandScape = ((oritation == UIDeviceOrientationLandscapeLeft) || (oritation == UIDeviceOrientationLandscapeRight)); if (isLandScape) { [self.textView mas_updateConstraints:^(MASConstraintMaker* make){ make.center.mas_equalTo(self.view); make.size.mas_equalTo(CGSizeMake([[UIScreen mainScreen] bounds].size.width - 50, [[UIScreen mainScreen] bounds].size.height - 80)); }]; } else { [self.textView mas_updateConstraints:^(MASConstraintMaker* make){ make.center.mas_equalTo(self.view); make.size.mas_equalTo(CGSizeMake([[UIScreen mainScreen] bounds].size.width - 50, [[UIScreen mainScreen] bounds].size.height - 150)); }]; }}- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{ }@end
这个是小弟目前想到的最直接的处理横竖屏的方法,如果以后有更好的方法会直接在这里更新!
8月10日晚更新:
然而,如果用autolayout来实现要用到判断方向是十分失败的,因为autolayout本身就应该符合完全自适应 - 包括对屏幕方向的敏感度!
所以上面的例子应该使用offset的属性,从而避免判断方向!
0 0
- autolayout - sizeClass - Masonry - 3
- autolayout - sizeClass - Masonry - 3
- autolayout - sizeClass - Masonry - 1
- autolayout - sizeClass - Masonry - 2
- autolayout - sizeClass - Masonry - 4
- autolayout - sizeClass - Masonry - 5
- autolayout - sizeClass - Masonry - 6
- autolayout - sizeClass - 3
- SizeClass 和AutoLayout教程3
- SizeClass 和AutoLayout教程3
- SizeClass 和AutoLayout教程3
- Masonry - Autolayout
- Masonry Autolayout
- AutoLayout(Masonry)
- AutoLayout And SizeClass
- iOS 开发 AutoLayout SizeClass
- SizeClass和AutoLayout
- Autolayout - 2 (sizeClass)
- Android Context 是什么?
- 南邮 OJ 2066 好奇的奥利安娜
- Adobe Dreamweaver CS6 下载及破解教程
- 类与对象(一)
- Parcelable和Serializable的区别
- autolayout - sizeClass - Masonry - 3
- 最好用的下拉刷新
- 南邮 OJ 2067 数数
- android 究竟是什么决定了app的名称 application label activity label
- app后端设计-- 数据库分表
- Debian8下搭建IVRE(docker方式)
- 仿新版QQ锁屏下弹窗
- Codeforces Round #Pi (Div. 2)
- LTE中的上行参考信号