UITableViewCell закругленные углы и клипы подпредставлений - PullRequest
9 голосов
/ 26 августа 2009

Я нигде не могу найти ничего (поисковые системы, документы, здесь и т. Д.), В котором показано, как создавать закругленные углы (особенно в сгруппированном табличном представлении) для элемента, который также обрезает подпредставления.

У меня есть код, который правильно создает закругленный прямоугольник из пути с 4 дугами (закругленными углами), который был протестирован в методе drawRect: в моей подклассной ячейке uitableviewcell. Проблема в том, что подпредставления, которые являются uibutton с их внутренними представлениями uiimage, не подчиняются CGContextClip (), которому подчиняется uitableviewcell.

Вот код:

- (void)drawRect:(CGRect)rect
{       
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat radius = 12;
    CGFloat width = CGRectGetWidth(rect);
    CGFloat height = CGRectGetHeight(rect);

    // Make sure corner radius isn't larger than half the shorter side
    if (radius > width/2.0)
        radius = width/2.0;
    if (radius > height/2.0)
        radius = height/2.0;    

    CGFloat minx = CGRectGetMinX(rect) + 10;
    CGFloat midx = CGRectGetMidX(rect);
    CGFloat maxx = CGRectGetMaxX(rect) - 10;
    CGFloat miny = CGRectGetMinY(rect);
    CGFloat midy = CGRectGetMidY(rect);
    CGFloat maxy = CGRectGetMaxY(rect);

    [[UIColor greenColor] set];


    CGContextBeginPath(context);

    CGContextMoveToPoint(context, minx, midy);

    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);

    CGContextClip(context);
    CGContextFillRect(context, rect);

    [super drawRect:rect];    
}

Поскольку этот конкретный случай является статическим (отображается только в 1 ряду кнопок), я могу редактировать изображения, используемые для кнопок, чтобы получить желаемый эффект.

ОДНАКО , у меня есть другой случай, который является динамическим. В частности, сгруппированная таблица с большим количеством результатов на основе базы данных, в которой будут показаны фотографии, которые могут находиться в первом или последнем ряду с закругленными углами и, следовательно, должны быть обрезаны).

Итак, возможно ли создать CGContextClip (), который также обрезает подпредставления? Если да, то как?

Ответы [ 5 ]

7 голосов
/ 28 марта 2010

Объект CALayer имеет функции для скругления углов:

UIView * someview = something here;
CALayer * layer = [someview layer];
layer.masksToBounds = YES;
layer.cornerRadius = radius;

И все готово. Вы также можете добавить некоторые цвета рамок и прочее, ознакомьтесь с документацией, если вам интересно.

3 голосов
/ 02 мая 2010

См. Этот код: http://gist.github.com/292384

Я использовал его в нескольких проектах, производительность отличная и настраиваемая. Он не использует cornerRadius, а отрисовка ячеек зависит от контекста.

2 голосов
/ 24 марта 2011

Попробуйте это в вашем представлении инициализатора:

self.layer.borderWidth = 2.0f;
self.layer.borderColor = [[UIColor greenColor] CGColor];
self.layer.masksToBounds = YES;
self.layer.cornerRadius = 12.0f;

И тогда вам вообще не нужно реализовывать какой-либо метод drawRect (по крайней мере, для целей округления границы и отсечения).

0 голосов
/ 25 октября 2017

Если у вас есть пользовательский UITableViewCell, вы можете сделать это в Swift 4.0:

class CustomTVC: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    self.layer.cornerRadius = 20
    self.layer.masksToBounds = true
}

}

0 голосов
/ 19 марта 2010

Создайте подкласс UIImageView с закругленными углами и прозрачностью. Сам UITableViewCell должен быть непрозрачным для лучшей производительности.

Посмотрите на этот пример .

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