Тень в верхней части ячейки UITableCellView - PullRequest
1 голос
/ 16 ноября 2011

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

Я могу создать тень из ячейки выше, используя приведенный ниже код, но могуне понять, как это сделать в ячейке внизу, так как это не показано, как будто ячейки отображаются в обратном порядке с точки зрения z-индекса.

self.layer.shadowOffset = CGSizeMake(0, 2);
self.layer.shadowColor = [[UIColor blackColor] CGColor];
self.layer.shadowRadius = 2;
self.layer.shadowOpacity = 0.5;

CGFloat top = self.layer.bounds.origin.y;
CGFloat left = self.layer.bounds.origin.x;
CGFloat width = self.layer.bounds.size.width;

CGRect shadowFrame = CGRectMake(left, top, width, 44);
CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath;
self.layer.shadowPath = shadowPath;

Любые предложения очень ценятся.

Вещи http://www.purplesmash.com/images/Things.jpg

Ответы [ 3 ]

0 голосов
/ 18 ноября 2011

Я отредактировал это в свете предложения от лунного света. Я помещаю этот код в метод addInnerTopShadow, когда ячейка нуждается в том, чтобы я вызвал метод. Я добавил еще один метод addInnerBottomShadow, который добавляет тень внизу.

Я вызываю эти методы в методе drawRect, и когда я хочу переключаться между состояниями, я вызываю метод:

[cell setNeedsDisplay];

Это позволяет мне переключать состояние ячейки, не делая таких вещей, как

[self.tableView reloadData];

Как показывают методы, у меня есть методы внешних теней, которые накладывают тень на первую и последнюю ячейки, но это еще одна проблема, на которую много раз отвечали. Теперь мое приложение работает точно так, как я хочу. Так что спасибо Робу и Лунному свету.

-(void)addInnerBottomShadow
{   
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Creating path which will hold our hollow rectangle
    CGMutablePathRef path = CGPathCreateMutable();

    CGPathAddRect(path, NULL, CGRectMake(0, 44, 480, 80));
    CGPathAddRect(path, NULL, CGRectMake(0, 54, 480, 96));

    // Saving current graphics context state
    CGContextSaveGState(context);

    // Configuring shadow
    CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 0.0f), 6.0f, [[UIColor blackColor] CGColor]);

    // Adding our path
    CGContextAddPath(context, path);  

    // Configure hollow rectangle fill color
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);

    // Fill rectangle and keep hollow part transparent
    CGContextEOFillPath(context);
    CGContextClipToRect(context, self.bounds);

    // Restore graphics context
    CGContextRestoreGState(context);
}

-(void)addInnerTopShadow
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, CGRectMake(-8.0f, -8.0f, 336.0f, 96.0f));
    CGPathAddRect(path, NULL, CGRectMake(-5.0f, 0.0f, 330.0f, 80.0f));

    // Saving current graphics context state
    CGContextSaveGState(context);

    // Configuring shadow
    CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 0.0f), 7.0f, [[UIColor blackColor] CGColor]);

    // Adding our path
    CGContextAddPath(context, path);  

    // Configure hollow rectangle fill color
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);

    // Fill rectangle and keep hollow part transparent
    CGContextEOFillPath(context);
    CGContextClipToRect(context, self.bounds);

    // Restore graphics context
    CGContextRestoreGState(context);
}
0 голосов
/ 18 ноября 2011

Просто создайте полый прямоугольник при рисовании с помощью CoreGraphics (выровняйте его так, чтобы полая часть покрывала видимый вид вашей ячейки) и установите тень для контекста - это сохранит производительность для вас.

ОБНОВЛЕНИЕ:
Я пробовал это в своей ячейке drawRect: метод

// Creating path which will hold our hollow rectangle
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(-8.0f, -8.0f, 336.0f, 96.0f));
CGPathAddRect(path, NULL, CGRectMake(-5.0f, 0.0f, 330.0f, 80.0f));

// Saving current graphics context state
CGContextSaveGState(context);

// Configuring shadow
CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 0.0f), 6.0f, 
                            [[UIColor blackColor] CGColor]);

// Adding our path
CGContextAddPath(context, path);  

// Configure hollow rectangle fill color
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);

// Fill rectangle and keep hollow part transparent
CGContextEOFillPath(context);

// Restore graphics context
CGContextRestoreGState(context);

Конечно, дополнительное улучшение будет предварительно рассчитано CGMutablePathRef path где-нибудь в инициализации или в этом методе по условию if(path == NULL).Цвета тоже можно сохранить.Если это должно быть последней строкой обновления вашей ячейки, возможно, вам не нужно сохранять контекстное состояние.

0 голосов
/ 16 ноября 2011

Вам, вероятно, нужно сделать это, рисуя тени как часть отмеченной ячейки, а не устанавливая свойства теней на окружающие ячейки.

Я бы сделал это, добавив один или два CAGradientLayers как потомкипроверенные ячейки contentView.layer.

...