При использовании
UITableView в iOS приложениях достаточно часто возникает необходимость изменить его внешний вид. Как минимум – поменять цвет фона ячеек и цвет разделителей. И в общем это не проблема для
UITableView в виде списка, но немного нетривиально для группированного
UITableView.
Проблема состоит в том что поменяв
backgroundColor ячейки в группированном
UITableView результат будет отличаться от ожидаемого. Решение состоит в том чтоб изменить
backgroundView ячейки. Довольно часто с этой целью используются заранее отрисованые картинки и соответственно
UIImageView. Но этот способ довольно неудобен если нужно всего лишь поменять цвет фона и границ ячейки.
Так что я создал подкласс
UIView для повторного использования в качестве фона ячеек. Благодаря использованию
UIBezierPath его реализация тривиальна, вот практически весь код:
- (void)drawRect:(CGRect)rect
{
CGRect bounds = CGRectInset(self.bounds,
0.5 / [UIScreen mainScreen].scale,
0.5 / [UIScreen mainScreen].scale);
UIBezierPath *path;
if (position == CellPositionSingle) {
path = [UIBezierPath bezierPathWithRoundedRect:bounds cornerRadius:kCornerRadius];
} else if (position == CellPositionTop) {
bounds.size.height += 1;
path = [UIBezierPath bezierPathWithRoundedRect:bounds
byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
cornerRadii:CGSizeMake(kCornerRadius, kCornerRadius)];
} else if (position == CellPositionBottom) {
path = [UIBezierPath bezierPathWithRoundedRect:bounds
byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight
cornerRadii:CGSizeMake(kCornerRadius, kCornerRadius)];
} else {
bounds.size.height += 1;
path = [UIBezierPath bezierPathWithRect:bounds];
}
[self.fillColor setFill];
[self.borderColor setStroke];
[path fill];
[path stroke];
}