Как установить градиентный фон UITableViewCell? - PullRequest
7 голосов
/ 18 июля 2010

Я хотел бы создать градиентный фон UITableViewCell, как приложение часов по умолчанию, которое поставляется на iPhone. Я не совсем уверен, как это сделать. Должен ли я создать изображение и установить его:

cell.contentView.backgroundColor = [UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"background.png"]];

или есть другой / лучший подход?

Ответы [ 2 ]

14 голосов
/ 18 октября 2011

Я нашел существующий ответ на этот вопрос, но не был удовлетворен.Вот альтернативный подход, который требует меньше кода, не требует переопределения каких-либо методов и может применяться к любому представлению.Идея состоит в том, чтобы добавить 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.

Я прошу прощения, что мое первоначальное решение не решило эту проблему.Но так как это может быть довольно тонко, я хотел бы обновить свой ответ этой дополнительной информацией.

7 голосов
/ 19 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...