UITableView с прозрачным градиентом сверху и снизу - PullRequest
7 голосов
/ 02 февраля 2012

Я искал этот форум, Google и другие форумы и не нашел ответа на мой конкретный вопрос.

В основном у меня есть UIView, который содержит UITableView.Я следовал этому уроку , и он был частично успешным.Проблема в градиенте.У меня есть фоновое изображение за UITableView.Так как ячейка приближается к градиенту, я хочу, чтобы фон показывал вместо белого.

Я также нашел этот пост , в котором я нашел учебник, но я неЯ не хочу использовать этот пост с моими собственными вопросами для Мэтта.

Любая помощь в правильном направлении будет отличной!

РЕДАКТИРОВАТЬ1: я знаю, что могу использовать другое изображение с фоновым изображениемсередина вырезана, но я ищу решение, которое ИЗБЕГАЕТ, используя PNG, если возможно.

EDIT2: Вот изображение того, что я получаю сейчас:

enter image description here

EDIT3:

Вот мой код:

Заголовок:

@interface MyView : UIViewController  {
    CAGradientLayer *_maskLayer;
    UITableView *_tableView;
}

@property (nonatomic, retain) CAGradientLayer *maskLayer;
@property (nonatomic, retain) IBOutlet UITableView *tableView;

Реализация:

@implementation HighScoresView_iPhone

@synthesize tableView = _tableView;
@synthesize maskLayer = _maskLayer;

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    if (![self maskLayer]) {
        [self setMaskLayer:[CAGradientLayer layer]];
        CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;
        CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor;

        [[self maskLayer] setColors:[NSArray arrayWithObjects:
                                     (id)outerColor, 
                                     (id)innerColor, 
                                     (id)innerColor, 
                                     (id)outerColor, 
                                     nil
                                     ]
         ];
        [[self maskLayer] setLocations:[NSArray arrayWithObjects:
                                       [NSNumber numberWithFloat:0.0], 
                                       [NSNumber numberWithFloat:0.2], 
                                       [NSNumber numberWithFloat:0.8], 
                                       [NSNumber numberWithFloat:1.0], 
                                       nil
                                       ]
        ];
        [[self maskLayer] setBounds:CGRectMake(0, 0, [[self scoreTableView] frame].size.width, [[self scoreTableView] frame].size.height)];
        [[self maskLayer] setAnchorPoint:CGPointZero];
        [[[self scoreTableView] layer] addSublayer:[self maskLayer]];
    }
}

Ответы [ 4 ]

22 голосов
/ 02 февраля 2012

Вы можете сделать это с помощью свойства CALayer mask. Но вы не можете установить маску на собственном слое табличного представления, потому что эта маска будет прокручиваться со строками таблицы. Вместо этого поместите табличное представление в новое суперпредставление (класса UIView), которое вы создаете только для этого. Назовите это tableMaskView.

Для нового суперпредставления его свойство backgroundColor должно быть установлено на UIColor.clearColor, а свойство opaque - на NO. Тогда вы можете установить его маску так:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.tableMaskView.bounds;
gradient.colors = [NSArray arrayWithObjects:
    (__bridge id)UIColor.clearColor.CGColor,
    UIColor.whiteColor.CGColor,
    UIColor.whiteColor.CGColor,
    UIColor.clearColor.CGColor,
    nil];
gradient.locations = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0],
    [NSNumber numberWithFloat:1.0/16],
    [NSNumber numberWithFloat:15.0/16],
    [NSNumber numberWithFloat:1],
    nil];
self.tableMaskView.layer.mask = gradient;

Использование маски слоя - не самый эффективный способ, но его проще всего программировать. Проверьте, достаточно ли это быстро.

1 голос
/ 25 мая 2017

Swift 3 версия rob mayoff s ответ :

let gradient = CAGradientLayer()
gradient.frame = tableMaskView.bounds
gradient.colors = [UIColor.clear.cgColor, UIColor.white.cgColor, 
                   UIColor.white.cgColor, UIColor.clear.cgColor]
gradient.locations = [0 as NSNumber, 1.0/16.0 as NSNumber, 
                      15.0/16.0 as NSNumber, 1 as NSNumber]
tableMaskView.layer.mask = gradient
0 голосов
/ 21 января 2014

Замените эту строку:

[[[self scoreTableView] layer] addSublayer:[self maskLayer]];

На эту:

self.scoreTableView.layer.mask = self.maskLayer;

(Или, если вы настаиваете на своем синтаксическом стиле, даже подумал, что не могу понять, почему):

[[[self scoreTableView] layer] setMask:[self maskLayer]];

Также этот ответ может помочь вам.

0 голосов
/ 02 февраля 2012

Похоже, цвет фона вашего табличного представления установлен на белый. Попробуйте установить прозрачность фона вашего табличного представления:

tableView.backgroundColor = [ UIColor clearColor ] ;
tableView.opaque = NO ;
...