我想創建一個漸變UITableViewCell背景,就像iPhone上默認的Clock應用程序一樣。我不確定如何實現這一點。我是否創建圖片並將其設置爲:如何設置漸變UITableViewCell背景?
cell.contentView.backgroundColor = [UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]];
或者是否有其他更好的方法?
我想創建一個漸變UITableViewCell背景,就像iPhone上默認的Clock應用程序一樣。我不確定如何實現這一點。我是否創建圖片並將其設置爲:如何設置漸變UITableViewCell背景?
cell.contentView.backgroundColor = [UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]];
或者是否有其他更好的方法?
我發現現有的回答這個問題,但並不滿足。這是一種替代方法,它需要更少的代碼,不需要重寫任何方法,並且可以應用於任何視圖。這個想法是將一個CAGradientLayer
作爲子層添加到UIView
的層。我無法在任何地方找到這種方法,所以我想分享。
添加CAGradientLayer
任何UIView
如下:
上UIView
頭種類 - UIView的+ Gradient.h:
#import <UIKit/UIKit.h>
@interface UIView (Gradient)
-(void) addLinearUniformGradient:(NSArray *)stopColors;
@end
類別上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
如何在創建後在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]];
這個例子僅表現如何設置一個簡單的兩止動梯度(具有均勻的間隔)。快速查看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;
}
卸下梯度不需要所有的情況,但如果你的使用情況會導致單元重用,您可能需要考慮刪除漸變。考慮調用這個方法的一個地方是來自UITableViewCell的prepareForReuse方法。
我很抱歉,我原來的解決方案沒有解決這個問題。但由於這件事可能非常微妙,我想用這些附加信息更新我的答案。
我認爲這是唯一的方法 – tadejsv 2010-07-18 17:39:55
如果我的身高不是相同的大小?我如何創建我的背景圖形? – 2010-07-18 18:04:46