Agregue esquinas networkingondeadas a todas las UIImageViews.

Me gustaría agregar algunas esquinas networkingondeadas a todas las UIImageViews en mi proyecto. Ya tengo el código funcionando, pero tengo que aplicarlo a cada image; ¿Debo subclamar UIImageView para agregar esto? Si es así, ¿alguien puede darme 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; } 

Puede usar una categoría para UIImage, que es una forma alternativa de subclass de una class y, a veces, más fácil para pequeños cambios.

por ejemplo, agregue un método que devuelva un UIImage con los attributes de esquina networkingondeados establecidos.

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

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

Compruebe esto – Esquinas networkingondeadas 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]; 

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

Cree una categoría en UIImageView así:

 - (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 networkingondear cualquier combinación (ver UIRectCorner ) de las esquinas, lo cual es especialmente útil si desea poner una image en un estilo de grupo UITableView . Sin embargo, hay una advertencia al hacer esto. Debido a que no hemos subclasificado UIImageView , no podemos inyectar 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 la image ni siquiera se configurarán cuando llame al método de categoría. Por lo tanto, debe asegurarse de que se establezcan los límites de la vista de image antes de agregar esquinas networkingondeadas (excepto si se 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 networkingondeadas, lo único que hace es eliminar las máscaras y configurar la cornerRadius a 0.

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

Puede subclass UIImageView y luego, si implementa su método setNeedsDisplay , las esquinas networkingondeadas funcionarán en subclasss. (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]; } 

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.