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; ¿Debo subclase UIImageView para agregar esto? Si es así, ¿alguien puede darme algunos consejos sobre cómo hacer esto?
Aqui esta el codigo
- (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;
}
Respuestas:
Puede usar una categoría para UIImage, que es una forma alternativa de subclasificar una clase y, a veces, más fácil para solo 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)...
Puede encontrar más información sobre las categorías de Objective-c http://macdevelopertips.com/objective-c/objective-c-categories.html
fuente
Compruebe esto: esquinas redondeadas en UIImage
La modificación de la capa parece ser la mejor forma.
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];
fuente
UIImageView
instancia.En lugar de subclasificar, puede lograr una funcionalidad más poderosa a través de categorías simples en UIImageView y CALayer.
Cree 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; }
Entonces, esto le permite redondear cualquier combinación (ver
UIRectCorner
) de esquinas, lo cual es especialmente útil si desea colocar una imagen en un estilo de grupoUITableView
. Sin embargo, hay una advertencia al hacer esto. Debido a que no hemos subclasificadoUIImageView
, no podemos inyectar ningún códigolayoutSubviews
, 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 imagen estén establecidos antes de agregar esquinas redondeadas (excepto si se usaUIRectCornersAllCorners
).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; todo lo que hace es eliminar las máscaras y establecer el valor
cornerRadius
en 0.fuente
Sí, debe subclase UIImageView y usar su subclase personalizada en todo su proyecto.
fuente
Puede crear una subclase de UIImageView y luego, si implementa su método setNeedsDisplay , las esquinas redondeadas funcionarán en las subclases. (no olvide importar QuartzCore)
-(void)setNeedsDisplay { self.layer.cornerRadius = 5; self.layer.masksToBounds = YES; [self.layer setBorderColor:[[UIColor whiteColor] CGColor]]; [self.layer setBorderWidth: 2.0]; }
fuente
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.
fuente
UIImageView
(esto se hace con éxito en el fragmento de código de la pregunta), sino sobre cómo reutilizar ese código de manera efectiva.