ios subclass code-reuse objective-c-category

ios - Agregue esquinas redondeadas a todos UIImageViews



subclass code-reuse (6)

Me gustaría agregar algunas esquinas redondeadas a todos los UIImageViews en mi proyecto. Ya tengo el código funcionando, pero tengo que aplicarlo a cada imagen; ¿Debería subclasificar UIImageView para agregar esto? Si es así, ¿alguien me puede dar algunos consejos sobre cómo hacer esto?

Aquí está el código

- (void)viewDidLoad { [super viewDidLoad]; NSString *mainpath = [[NSBundle mainBundle] bundlePath]; welcomeImageView.image = [UIImage imageWithContentsOfFile:[mainpath stringByAppendingString:@"/test.png"]]; welcomeImageView.layer.cornerRadius = 9.0; welcomeImageView.layer.masksToBounds = YES; welcomeImageView.layer.borderColor = [UIColor blackColor].CGColor; welcomeImageView.layer.borderWidth = 3.0; CGRect frame = welcomeImageView.frame; frame.size.width = 100; frame.size.height = 100; welcomeImageView.frame = frame; }


En lugar de crear subclases, puede lograr una funcionalidad más potente a través de categorías simples en UIImageView y CALayer.

Crea una categoría en UIImageView como esta:

- (void)maskRoundCorners:(UIRectCorner)corners radius:(CGFloat)radius { // To round all corners, we can just set the radius on the layer if ( corners == UIRectCornerAllCorners ) { self.layer.cornerRadius = radius; self.layer.masksToBounds = YES; } else { // If we want to choose which corners we want to mask then // it is necessary to create a mask layer. self.layer.mask = [CALayer maskLayerWithCorners:corners radii:CGSizeMake(radius, radius) frame:self.bounds]; } }

Esto llama a un método de categoría en CALayer:

+ (id)maskLayerWithCorners:(UIRectCorner)corners radii:(CGSize)radii frame:(CGRect)frame { // Create a CAShapeLayer CAShapeLayer *mask = [CAShapeLayer layer]; // Set the frame mask.frame = frame; // Set the CGPath from a UIBezierPath mask.path = [UIBezierPath bezierPathWithRoundedRect:mask.bounds byRoundingCorners:corners cornerRadii:radii].CGPath; // Set the fill color mask.fillColor = [UIColor whiteColor].CGColor; return mask; }

Por lo tanto, esto le permite redondear cualquier combinación (consulte UIRectCorner ) de las esquinas, lo que es especialmente útil si desea colocar una imagen en un estilo de grupo UITableView . Sin embargo, hay una advertencia al hacer esto. Debido a que no hemos subclasificado UIImageView , no podemos UIImageView ningún código en layoutSubviews , lo que significa que la capa de máscara puede no ser correcta. De hecho, al configurar celdas, los límites de la vista de imagen ni siquiera se establecerán cuando llame al método de categoría. Por lo tanto, debe asegurarse de que los límites de la vista de la imagen UIRectCornersAllCorners establecidos antes de agregar esquinas redondeadas (excepto si usa UIRectCornersAllCorners ).

Aquí hay un código que hace esto:

// Perform corner rounding UIRectCorner corners = !UIRectCornerAllCorners; if (indexPath.row == 0) corners = UIRectCornerTopLeft; if (indexPath.row == numberOfRowsInTheTable) corners |= UIRectCornerBottomLeft; if (corners > 0) { cell.imageView.bounds = CGRectMake(0.f, 0.f, [self.tableView rowHeight], [self.tableView rowHeight]); [cell.imageView maskRoundCorners:corners radius:10.f]; } else { [cell.imageView removeRoundCornersMask]; }

Tengo otra categoría que elimina las esquinas redondeadas: lo único que hace es eliminar las máscaras y configurar el cornerRadius en 0.


Mira esto: esquinas redondeadas en UIImage

La modificación de la capa parece ser la mejor manera.

UIImageView * roundedView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"wood.jpg"]]; // Get the Layer of any view CALayer * l = [roundedView layer]; [l setMasksToBounds:YES]; [l setCornerRadius:10.0];


Podría usar una categoría para UIImage, que es una forma alternativa de subclase de una clase y, a veces, más sencilla para pequeños cambios.

por ejemplo, agregue un método que devuelva un UIImage con el conjunto de atributos de esquina redondeada.

+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)...

se puede encontrar más información sobre las categorías Objective-c http://macdevelopertips.com/objective-c/objective-c-categories.html


Prueba esto,

coverImage.image = [UIImage imageWithContentsOfFile:@"coverImage.png"]; coverImage.layer.masksToBounds = YES; coverImage.layer.cornerRadius = 10.0; coverImage.layer.borderWidth = 1.0; coverImage.layer.borderColor = [[UIColor brown] CGColor];

esto puede ayudarte.


Puede subclase UIImageView y luego, si implementa su método setNeedsDisplay , las esquinas redondas funcionarán en subclases. (no te olvides de importar QuartzCore)

-(void)setNeedsDisplay { self.layer.cornerRadius = 5; self.layer.masksToBounds = YES; [self.layer setBorderColor:[[UIColor whiteColor] CGColor]]; [self.layer setBorderWidth: 2.0]; }


Sí, debe subclasificar UIImageView y usar su subclase personalizada en todo su proyecto.