Я нашел существующий ответ на этот вопрос, но не был удовлетворен.Вот альтернативный подход, который требует меньше кода, не требует переопределения каких-либо методов и может применяться к любому представлению.Идея состоит в том, чтобы добавить 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"]).Поскольку ячейки используются повторно, если вы всегда добавляете слой градиента в ячейку табличного представления при каждом снятии очереди с ячейки, вы можете в конечном итоге добавить несколько слоев градиента в ячейку табличного представления в течение всего времени существования ячейки.Это может быть источником снижения производительности.Эта проблема может возникнуть без каких-либо изменений в видимых результатах, поэтому может быть трудно обнаружить / наблюдать.Есть несколько способов решить эту проблему, но вы можете подумать об одном: изменить исходный код, указанный выше, в дополнение к добавлению 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;
}
Удаление градиента не требуется для всех случаев использования, но если вашИспользование варианта использования приводит к повторному использованию ячейки, вы можете рассмотреть возможность удаления градиента.Один из способов рассмотреть вызов этого метода - это метод prepareForReuse UITableViewCell.
Я прошу прощения, что мое первоначальное решение не решило эту проблему.Но так как это может быть довольно тонко, я хотел бы обновить свой ответ этой дополнительной информацией.