She*_*lam 7 iphone cocoa-touch objective-c uitableview
我想创建一个渐变UITableViewCell背景,就像iPhone上的默认Clock应用程序一样.我不确定如何实现这一目标.我是否创建图像并进行设置:
cell.contentView.backgroundColor = [UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]];
Run Code Online (Sandbox Code Playgroud)
还是有其他/更好的方法?
Chr*_*ris 14
我找到了这个问题的现有答案,但并不满意.这是一种替代方法,需要更少的代码,不需要覆盖任何方法,并且可以应用于任何视图.我们的想法是在CAGradientLayer
图层中添加一个子UIView
图层.我无法在任何地方找到这种方法,所以我想分享.
添加CAGradientLayer
到任意UIView
如下:
UIView
标题上的类别- UIView + Gradient.h:
#import <UIKit/UIKit.h>
@interface UIView (Gradient)
-(void) addLinearUniformGradient:(NSArray *)stopColors;
@end
Run Code Online (Sandbox Code Playgroud)
UIView
实施类别UIView + Gradient.m:
#import "UIView+Gradient.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIView (Gradient)
-(void) addLinearUniformGradient:(NSArray *)stopColors
{
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.bounds;
gradient.colors = stopColors;
gradient.startPoint = CGPointMake(0.5f, 0.0f);
gradient.endPoint = CGPointMake(0.5f, 1.0f);
[self.layer addSublayer:gradient];
}
@end
Run Code Online (Sandbox Code Playgroud)
如何UITableViewCell
在创建以下内容后在backgroundView 上设置渐变UITableViewCell
:
// Set the gradient for the cell's background
CGRect backgroundViewFrame = cell.contentView.frame;
backgroundViewFrame.size.height = yourCellHeight;
cell.backgroundView = [[UIView alloc] initWithFrame:backgroundViewFrame];
[cell.backgroundView addLinearUniformGradient:[NSArray arrayWithObjects:
(id)[[UIColor redColor] CGColor],
(id)[[UIColor greenColor] CGColor], nil]];
Run Code Online (Sandbox Code Playgroud)
此示例仅显示了如何设置简单的两级渐变(具有均匀间距).快速浏览CAGradientLayer
文档将向您展示如何设置更复杂的渐变.
(*编辑其他重要信息*)
需要记住的另一件事是,如果你在像tableView:cellForRowAtIndexPath这样的方法中添加渐变层,UITableViewCells通常会被重用(即[tableView dequeueReusableCellWithIdentifier:@"foo"]).由于正在重复使用单元格,如果每次单元格出列时始终向表格视图单元格添加渐变图层,则最终可能会在单元格的生命周期内向tableview单元格添加多个渐变图层.这可能是性能降低的原因.在没有任何可见结果变化的情况下可能会出现此问题,因此可能难以检测/观察.有几种方法可以解决这个问题,但您可以考虑做的一件事是修改上面的原始代码,以及添加CAGradientLayer,以将创建的CAGradientLayer返回给调用者.然后编写另一个类别方法相当简单,如果它实际包含在视图中,则允许删除渐变图层:
-(BOOL) removeGradient:(CAGradientLayer *)gradientLayer
{
// Search for gradient layer and remove it
NSArray *layers = [self.layer sublayers];
for ( id layer in layers ) {
if ( layer == gradientLayer ) {
[gradientLayer removeFromSuperlayer];
return YES;
}
}
// Failed to find the gradient layer in this view
return NO;
}
Run Code Online (Sandbox Code Playgroud)
并非所有用例都需要删除渐变,但如果您的用例导致单元格重用,则可能需要考虑删除渐变.考虑调用此方法的一个地方是来自UITableViewCell的prepareForReuse方法.
我很抱歉我的原始解决方案没有解决这个问题.但由于它可能非常微妙,我想用这些附加信息更新我的答案.
归档时间: |
|
查看次数: |
7710 次 |
最近记录: |