IOS Layer的"自动布局"
2015-04-17 21:08
741 查看
原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
前言:今天在stackoverflow上给一个外国友人回答问题的时候,遇到了Layer的自动布局的问题。这里写出来,分享给需要的人。
不使用图片作为背景的话,一种直接的方式就是使用Layer进行绘制
很简单的绘制
效果图
![](http://img.blog.csdn.net/20150417203716561)
但是,横屏后就发现不对了
![](http://img.blog.csdn.net/20150417203933005)
代码很简单,由于在view的bounds改变的时候,在对应的controller会调用viewDidLayoutSubviews
所以,在上面的viewController中加入如下代码,
则横屏正常
![](http://img.blog.csdn.net/20150417204214833)
但是,我们都知道,在横竖屏切换的时候,IOS会自动生成一个动画,如果用粗糙的解决方案,只是在动画结束后改变了frame,动画的过程中仍然能够看淡空白
如图
![](http://img.blog.csdn.net/20150417204358511)
把layer绑定到view
定义一个view,把他的layer的class设置为CAGradientClass
然后,使用这个view,设置autoresizingmask
再看看切换的动画(生成的gif有点水印,谅解)
![](http://img.blog.csdn.net/20150417210019175)
欢迎关注我的IOS-SDK详解专栏
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
我自己写的一个下拉刷新库
https://github.com/wenchenhuang/WCPullRefreshControl
http://blog.csdn.net/hello_hwc?viewmode=list
前言:今天在stackoverflow上给一个外国友人回答问题的时候,遇到了Layer的自动布局的问题。这里写出来,分享给需要的人。
Layer支持autolayout吗?
ios 的CALayer到目前为止不支持AutoLayout也不支持autoresizingMask。举个例子
如果,要绘制一个渐变的颜色,作为背景色。定义一个配置函数-(void)setupCAGradientLayer:(CAGradientLayer *)gradient{ UIColor *colorOne = [UIColor colorWithRed:(120/255.0) green:(135/255.0) blue:(150/255.0) alpha:1.0]; UIColor *colorTwo = [UIColor colorWithRed:(57/255.0) green:(79/255.0) blue:(96/255.0) alpha:1.0]; NSArray *colors = [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil]; NSNumber *stopOne = [NSNumber numberWithFloat:0.0]; NSNumber *stopTwo = [NSNumber numberWithFloat:1.0]; NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil]; gradient.colors = colors; gradient.locations = locations; }
不使用图片作为背景的话,一种直接的方式就是使用Layer进行绘制
很简单的绘制
#import "ViewController.h" @interface ViewController () @property (strong,nonatomic) CAGradientLayer * gradient; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.gradient = [CAGradientLayer layer]; [self setupCAGradientLayer:self.gradient]; self.gradient.frame = self.view.frame; [self.view.layer addSublayer:self.gradient]; }
效果图
但是,横屏后就发现不对了
粗糙的解决方案
最直观的解决方案就是,在进行view的bounds改变的时候,进行layer的大小调整。代码很简单,由于在view的bounds改变的时候,在对应的controller会调用viewDidLayoutSubviews
所以,在上面的viewController中加入如下代码,
-(void)viewDidLayoutSubviews{ [super viewDidLayoutSubviews]; self.gradient.frame = self.view.bounds; }
则横屏正常
但是,我们都知道,在横竖屏切换的时候,IOS会自动生成一个动画,如果用粗糙的解决方案,只是在动画结束后改变了frame,动画的过程中仍然能够看淡空白
如图
较好的解决方案
由于IOS对view的支持较好,不管是使用auto layout,还是autoresizingmask,都很方便。所以,一种比较好的解决方案就是使用view来处理。把layer绑定到view
定义一个view,把他的layer的class设置为CAGradientClass
#import <UIKit/UIKit.h> @interface BackgrundView : UIView @end
#import "BackgrundView.h" @interface BackgrundView() @end @implementation BackgrundView +(Class)layerClass{ return [CAGradientLayer class]; } @end
然后,使用这个view,设置autoresizingmask
#import "ViewController.h" #import "BackgrundView.h" @interface ViewController () @property BackgrundView * backgroundview; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.backgroundview = [[BackgrundView alloc] initWithFrame:self.view.frame]; self.backgroundview.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; [self.view addSubview:self.backgroundview]; [self setupCAGradientLayer:(CAGradientLayer*)self.backgroundview.layer]; } @end
再看看切换的动画(生成的gif有点水印,谅解)
欢迎关注我的IOS-SDK详解专栏
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
我自己写的一个下拉刷新库
https://github.com/wenchenhuang/WCPullRefreshControl
相关文章推荐
- iOS - 使用"Masonry"库做约束(自动布局)
- 【iOS开发】设置textView的默认提示文字,也就是textView变相的"placeholder"。
- 【iOS界面开发】Objective-C自动布局(Auto Layout & SizeClass)
- AXIS的"dotnet_soapenc_bugfix"属性会自动重设的bug,将导致c++客户端调用soap接口失败
- "ios模拟器未能安装此应用程序"
- iOS开发-自动布局之autoresizingMask使用详解(Storyboard&amp;Code)
- "ios模拟器未能安装此应用程序"
- "为自动填充列调整大小期间不能执行此操作"解决办法
- 把字符串放到规定的范围内,超出的部分自动变为"..."完美解决
- CEdit的"\r\n"不换行和自动换行问题
- iOS自动布局高级用法 && 纯代码约束写法
- iOS 代码设置自动布局
- IOS开发-自动布局之autoresizingMask使用详解(Storyboard&Code)
- 图解用"MySQL Administrator"工具实现自动备份数据库
- msql 如何用"最小缺失数"实现日期的自动补全
- iOS Dev (18) Undefined symbols for architecture xxx: "_main", referenced from ...
- IOS笔记(二)——Objective-C面向对象中的"@class和#import"
- iOS:自动布局 AutoLayout && Autosizing masks
- "ios模拟器未能安装此应用程序"
- iOS 本地持久化 "归档"