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
原创粉丝点击