Вот реальное решение, которое не использует изображения и должно работать в любой ситуации.Это немного сложно из-за проблемы с tableView: willDisplayCell: forRowAtIndexPath: только для iPad (см. Комментарий).Кроме того, если вы знаете, как закруглять отдельные углы, все становится совершенно естественным
Контроллер должен округлять углы, потому что именно он знает, в каком положении находится ячейка (первая, последняя и т. Д.), И влияет на то, какие углы закруглены.Лучшее место для округления, по-видимому, находится в tableView: willDisplayCell: forRowAtIndexPath :.Ниже приведен пример подкласса UITableViewController:
#import "MainViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface CustomCell : UITableViewCell
@end
@implementation CustomCell
- (void)installSelectedBackgroundView {
UIView *view = [[UIView alloc] initWithFrame:self.frame];
view.backgroundColor = [UIColor redColor]; // choose a color or add a gradient, etc
view.layer.borderWidth = 1; // optional border
view.layer.borderColor = [[UIColor grayColor] CGColor];
self.selectedBackgroundView = view;
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
[self installSelectedBackgroundView];
}
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
[self installSelectedBackgroundView];
}
@end
@implementation MainViewController
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
CustomCell *cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.textLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];
return cell;
}
+ (void)roundCorners:(UIRectCorner)corners forView:(UIView *)view {
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
byRoundingCorners:corners
cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = view.bounds;
maskLayer.path = maskPath.CGPath;
view.layer.mask = maskLayer;
}
+ (void)roundCornersForSelectedBackgroundViewForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {
NSUInteger rows = [tableView numberOfRowsInSection:indexPath.section];
if (rows == 1) {
[[self class] roundCorners:UIRectCornerAllCorners forView:cell.selectedBackgroundView];
} else if (indexPath.row == 0) {
[[self class] roundCorners:UIRectCornerTopLeft | UIRectCornerTopRight forView:cell.selectedBackgroundView];
} else if (indexPath.row == rows-1) {
[[self class] roundCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight forView:cell.selectedBackgroundView];
} else {
[[self class] roundCorners:0 forView:cell.selectedBackgroundView];
}
}
+ (void)deferredRoundCornersForSelectedBackgroundViewForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {
int64_t delayInSeconds = 0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[[self class] roundCornersForSelectedBackgroundViewForTableView:tableView cell:cell indexPath:indexPath];
});
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// cell.selectedBackgroundView.frame is not sized correctly yet, so rounding the corners has to be deferred briefly
[[self class] deferredRoundCornersForSelectedBackgroundViewForTableView:tableView cell:cell indexPath:indexPath];
}
@end