用很简单的方法解决了一个很简单的问题...
事情发生在几个小时前。
我用5s打开了一个正在开发的小项目,
在一个页面中,有一个渐变的图层,他,错位了。
他具备如下特点:
1.仅仅是一个简单的颜色渐变
2.是用layer做的效果
3.xib适配,6s为基准大小。
查看了一下代码,之前屎一样的逻辑是这样的
在viewDidLoad
里面进行判断,如果这个layer还没被加载,就创建并加载之(判断方法是view.layers的subLayers的count...)。
让我想起来更之前的想法是懒加载这个layer,在ViewDidLayoutSubviews里面设置layer.frame = view.bouns
的设置。
现在看来显然这几个方法都是行不通的,谁也不想看到一个错位的渐变,哪怕他渐变的再漂亮再有层次也不行。
得以解决问题的方法依然简单的像屎一样。
在ViewDidLayoutSubviews里面,每次layout最后都进行一次加载。
在加载之前当然要判断这个Layer是否已经存在,如果存在就remove掉。
所以需要设置两个属性,view和layer。
问题解决...
问题简单到完全不需要上图就能理解。
不过还是把代码贴出来...
// 分割线
@property (weak, nonatomic) IBOutlet UIView *lineView;
// 渐变分割线
@property (nonatomic, weak) CAGradientLayer * lineLayer;
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// ...若干其他操作
[self addLayer];
}
- (void)addLayer {
// 判断存在,存在就删
if (self.lineLayer) {
[self.lineLayer removeFromSuperlayer];
}
CAGradientLayer *lineLayer = [[CAGradientLayer alloc] init];
lineLayer.frame = self.lineView.bounds;
// 渐变过程,kColor一堆数字,是一个颜色值...
lineLayer.colors = [NSArray arrayWithObjects:(id)[kColor768082 colorWithAlphaComponent:0.0].CGColor,
(id)[kColorF2C5B8 colorWithAlphaComponent:0.7]. CGColor,
(id)[kColorF2C5B8 colorWithAlphaComponent:0.0]. CGColor,
(id)[kColorF2C5B8 colorWithAlphaComponent:0.0].CGColor,
(id)[kColorF2C5B8 colorWithAlphaComponent:0.7]. CGColor,
(id)[kColorF2C5B8 colorWithAlphaComponent:0.0]. CGColor,
nil];
// 设置位置,这个数组的count与colors是一致的
lineLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],
[NSNumber numberWithFloat:0.4],
[NSNumber numberWithFloat:0.42],
[NSNumber numberWithFloat:0.58],
[NSNumber numberWithFloat:0.6],
[NSNumber numberWithFloat:1.0],
nil];
lineLayer.startPoint = CGPointMake(0,0.5);
lineLayer.endPoint = CGPointMake(1,0.5);
[self.lineView.layer addSublayer:lineLayer];
self.lineLayer = lineLayer;
}