ios uitableview ios7

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]; } }