Pergunta

Gostaria de adicionar alguns cantos arredondados a todas as visualizações do UIImage em meu projeto. Eu já tenho o código funcionando, mas estou tendo que aplicá -lo a todas as imagens; Devo subclasse UiImageView para adicionar isso? Se sim, alguém pode me dar algumas dicas sobre como fazer isso?

Aqui está o 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;
}
Foi útil?

Solução

Você pode usar uma categoria para UIImage, que é uma maneira alternativa de subclasse uma classe e, às vezes, mais fácil para pequenas alterações.

Por exemplo, adicione um método que retorna uma UIImage com o conjunto de atributos de canto arredondado.

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

Mais informações sobre as categorias Objective-C podem ser encontradas http://macdeveloptips.com/obndive-c/objective-c-categories.html

Outras dicas

Verifique isso -Cantos arredondados na UIImage

A modificação da camada parece ser a melhor maneira.

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

Em vez de subclassem, você pode obter uma funcionalidade mais poderosa por meio de categorias simples no UIImageView e na calayer.

Crie uma categoria no UIImageView como este:

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

Isso chama um método de categoria na 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;
}

Então, isso permite arredondar qualquer combinação (veja UIRectCorner) de cantos, o que é especialmente útil se você quiser colocar uma imagem em um estilo de grupo UITableView. Há uma ressalva ao fazer isso, no entanto. Porque não subclassemos UIImageView, não podemos injetar nenhum código em layoutSubviews, o que significa que a camada de máscara pode não estar correta. De fato, ao configurar as células, os limites da visualização da imagem nem serão definidos quando você chama o método da categoria. Portanto, você precisa garantir que os limites da visualização da imagem sejam definidos antes de adicionar cantos arredondados (exceto se usar UIRectCornersAllCorners).

Aqui está algum código que faz isso:

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

Eu tenho outra categoria que remove os cantos arredondados - tudo o que faz é remover qualquer máscara e definir o cornerRadius a 0.

Sim, você deve subclasse UIImageView e usar sua subclasse personalizada em todo o seu projeto.

Você pode subclasse UiImageView e, se você implementar seu SETNEEDSDISPLAY Método Os cantos redondos funcionarão em subclasses. (Não se esqueça de importar quartzcore)

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

Tente isso,

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

Isso pode ajudá -lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top