Solución para esquinas redondeadas de UITableView agrupadas, iOS7
(4)
Esta pregunta ya tiene una respuesta aquí:
Desde la introducción de iOS7, las esquinas redondeadas para las celdas de UITableView con estilo agrupado son eliminadas por Apple ( confirmado aquí ). Aún así, estoy seguro de que hay personas inteligentes que han construido soluciones para esto.
Para ayudarnos a mí y a muchos otros programadores iOS, publique sus soluciones para obtener esquinas redondeadas para las celdas en un UITableViewStyleGrouped en iOS7 en este hilo. ¡Será muy apreciada!
Puede usar UIImageView y establecer el radio de la esquina como sigue:
CALayer * l = [self.cellBackgroundImage layer];
[l setMasksToBounds:YES];
[l setCornerRadius:5.0];
Para usar esto, debes importar quarts core:
#import <QuartzCore/QuartzCore.h>
Simplemente agregue el siguiente método delegado UITableView en su código. Realmente me ayudó a tener el mismo problema que tú en Table view en iOS7. Pruebe el código siguiente, puede ser que también resuelva su problema:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(tintColor)]) {
if (tableView == tblProfileDetails) { // self.tableview
CGFloat cornerRadius = 5.f;
cell.backgroundColor = UIColor.clearColor;
CAShapeLayer *layer = [[CAShapeLayer alloc] init];
CGMutablePathRef pathRef = CGPathCreateMutable();
CGRect bounds = CGRectInset(cell.bounds, 5, 0);
BOOL addLine = NO;
if (indexPath.row == 0 && indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
} else if (indexPath.row == 0) {
CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius);
CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds));
addLine = YES;
} else if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius);
CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
} else {
CGPathAddRect(pathRef, nil, bounds);
addLine = YES;
}
layer.path = pathRef;
CFRelease(pathRef);
layer.fillColor = [UIColor colorWithWhite:1.f alpha:0.8f].CGColor;
if (addLine == YES) {
CALayer *lineLayer = [[CALayer alloc] init];
CGFloat lineHeight = (1.f / [UIScreen mainScreen].scale);
lineLayer.frame = CGRectMake(CGRectGetMinX(bounds)+5, bounds.size.height-lineHeight, bounds.size.width-5, lineHeight);
lineLayer.backgroundColor = tableView.separatorColor.CGColor;
[layer addSublayer:lineLayer];
}
UIView *testView = [[UIView alloc] initWithFrame:bounds];
[testView.layer insertSublayer:layer atIndex:0];
testView.backgroundColor = UIColor.clearColor;
cell.backgroundView = testView;
}
}
}
Teniendo en cuenta que puede tener múltiples grupos en su mesa, algunas celdas están redondeando justo en las esquinas superiores, otras justo en la parte inferior, y otras no están redondeadas. Así que creé aquí muy rápido una subclase (que puede ser realmente acortada) de UITableViewCell con los siguientes métodos:
Una propiedad que puede llamar a cualquier cosa que desee, llamé Arriba y abajo:
@property(nonatomic,assign) BOOL top,down;
La implementación:
- (void)layoutSubviews
{
[super layoutSubviews];
if(self.top && self.down)
{
self.layer.cornerRadius = 10;
self.layer.masksToBounds = YES;
return;
}
if (self.top)
{
CAShapeLayer *shape = [[CAShapeLayer alloc] init];
shape.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(10, 10)].CGPath;
self.layer.mask = shape;
self.layer.masksToBounds = YES;
return;
}
if (self.down)
{
CAShapeLayer *shape = [[CAShapeLayer alloc] init];
shape.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height) byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)].CGPath;
self.layer.mask = shape;
self.layer.masksToBounds = YES;
}
}
Para usar es simple, si su celda es la primera de un grupo, establezca TOP = True, si es la última, DOWN = true, si la celda es la única en el grupo, TOP y DOWN = true.
Si quiere más o menos redondeado, simplemente cambie las radios de 10 a otro valor.
Eso es todo, puede hacerlo más corto evitando la repetición de código, o usando CAShapeLayer en todos los casos, de todos modos, espero que ayude.
Aquí hay una respuesta ligeramente mejorada a la de Roberto Ferraz.
Calcula la celda superior e inferior para usted (suponiendo que no haya espacio entre las celdas).
También utiliza el truco de eliminar bordes del grupo que funciona en iOS7
@interface CustomTableViewCell : UITableViewCell
Anular mensajes:
#define radius 10
- (void)layoutSubviews {
[super layoutSubviews];
CGRect frame = self.frame;
CGFloat top = frame.origin.y;
CGFloat bottom = top + frame.size.height;
UIRectCorner corners = UIRectCornerAllCorners;
CAShapeLayer* mask = [CAShapeLayer layer];
for (UIView* view in self.superview.subviews) {
if (view.frame.origin.y + view.frame.size.height == top) {
corners = corners & ~(UIRectCornerTopLeft|UIRectCornerTopRight);
} else if (view.frame.origin.y == bottom) {
corners = corners & ~(UIRectCornerBottomLeft|UIRectCornerBottomRight);
}
}
mask.path = [UIBezierPath bezierPathWithRoundedRect:
CGRectMake(0, 0, frame.size.width, frame.size.height)
byRoundingCorners:corners
cornerRadii:CGSizeMake(radius, radius)].CGPath;
self.layer.mask = mask;
self.layer.masksToBounds = YES;
}
/*
iOS 7 workaround to get rid of top and bottom separators
*/
- (void) addSubview:(UIView*)view {
if (view.frame.origin.x > 0 || view.frame.size.width < self.frame.size.width) {
[super addSubview:view];
}
}