Добавить закругленные углы ко всем UIImageViews - PullRequest
78 голосов
/ 31 января 2010

Я хотел бы добавить несколько закругленных углов ко всем 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;
}

Ответы [ 6 ]

114 голосов
/ 31 января 2010

Проверьте это - Закругленные углы на 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];
25 голосов
/ 31 января 2010

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

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

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

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

16 голосов
/ 09 мая 2012

Вместо создания подклассов вы можете получить более мощную функциональность с помощью простых категорий в 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.

5 голосов
/ 31 января 2010

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

4 голосов
/ 23 мая 2012

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

-(void)setNeedsDisplay {
    self.layer.cornerRadius = 5;
    self.layer.masksToBounds = YES;
    [self.layer setBorderColor:[[UIColor whiteColor] CGColor]];
    [self.layer setBorderWidth: 2.0];
}
3 голосов
/ 16 января 2013

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

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

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

...