Добавьте округленные углы ко всем UIImageViews

Я хотел бы добавить некоторые округленные углы ко всем UIImageViews в моем проекте. У меня уже есть код, но мне нужно применить его к каждому изображению; должен ли я подклассифицировать UIImageView, чтобы добавить это? Если да, может ли кто-нибудь дать мне несколько указаний относительно того, как это сделать?

Вот код

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

Ответ 1

Вы можете использовать категорию для UIImage, которая является альтернативным способом подкласса класса, а иногда проще для небольших изменений.

Например, добавьте метод, который возвращает UIImage с установленными закругленными атрибутами угла.

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

Более подробная информация о категориях Objective-c может быть найдена http://macdevelopertips.com/objective-c/objective-c-categories.html

Ответ 2

Проверьте это - Округлые углы на UIImage

Модификация слоя - лучший способ.

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

Ответ 3

Вместо подкласса вы можете добиться более мощных функций с помощью простых категорий в UIImageView и CALayer.

Создайте категорию в UIImageView следующим образом:

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

Это вызывает метод категории на 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;
}

Таким образом, это позволяет вам обойти любую комбинацию (см. UIRectCorner) углов, что особенно удобно, если вы хотите поместить изображение в групповой стиль UITableView. При этом есть одно предостережение. Поскольку мы не подклассифицировали UIImageView, мы не можем вводить какой-либо код в layoutSubviews, что означает, что слой маски может быть неправильным. Фактически, при настройке ячеек границы представления изображения даже не будут заданы при вызове метода категории. Следовательно, вам необходимо обеспечить, чтобы границы изображения были установлены перед добавлением закругленных углов (за исключением использования UIRectCornersAllCorners).

Вот код, который делает это:

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

У меня есть другая категория, которая удаляет закругленные углы - все, что делает, это удаление любых масок и установка cornerRadius в 0.

Ответ 4

Да, вы должны подклассифицировать UIImageView и использовать свой собственный подкласс во всем своем проекте.

Ответ 5

Вы можете подклассифицировать UIImageView, а затем, если вы реализуете свой метод setNeedsDisplay, круглые углы будут работать в подклассах. (не забудьте импортировать QuartzCore)

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

Ответ 6

Попробуйте это,

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

это может помочь вам.