2016-01-20 2 views
3

Я пытаюсь закруглить углы моего взгляда, используя «UIBezierPath». Мне нужно только округлить верхний правый и верхний левый.Угловой радиус с использованием UIBezierPath

Я использовал следующий код

-(void)setMaskOnView:(UIView *)givenView 
    { 
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:givenView.bounds byRoundingCorners: (UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(10.0, 10.0)]; 
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
maskLayer.frame = givenView.bounds; 
maskLayer.path = maskPath.CGPath; 
givenView.layer.mask = maskLayer; 
} 

enter image description here

Но мой TopRight уголок не круглый.

Я использовал

UIRectCornerAllCorners

Но это не округлять мои правый углы

enter image description here

Любая вещь я не хватает ??

+1

Где вы звоните 'setMaskOnView'? Возможно, до того, как макет завершился. Поэтому оценки еще не установлены правильно и будут/изменяться. – luk2302

+0

givenView.bounds изменено на givenView.superview.bounds и проверяет, работает ли –

+0

@ luk2302. Я вызываю его в viewDidLoad –

ответ

1

Предлагаю другой подход. Загрузите изображение с закругленными верхними углами и установите его как содержимое CALayer. Установите этот слой в качестве маски вашего слоя. Обновите размер слоя маски в layoutSubivews данного вида или viewDidLayoutSubviews данного контроллера.

Загрузка изображения в качестве слоя contenst

CALayer *maskLayer = [[CALayer alloc] init]; 
UIImage *maskImage = [UIImage imageNamed:@"mask_image.png" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]; 
maskLayer.contents = (__bridge id _Nullable)(maskImage.CGImage); 

mainLayer.mask = maskLayer 

[EDIT] Отвечая на ваши вопросы в комментариях

Либо с помощью CAShapeLayer или изображения в качестве маски вы должны изменить размер маски слоя, так что будет иметь того же размера, что и маскированный слой. Если мы говорим о UITableViewCell, создайте свою собственную производную ячейку и измените форму маски в layoutSubviews. Ниже приведен пример кода (MyTableCell загружается из раскадровки):

@interface MyTableCell() 

@property (nonatomic, strong) CAShapeLayer *maskLayer; 

@end 

@implementation MyTableCell 

- (void)awakeFromNib 
{ 
    self.maskLayer = [[CAShapeLayer alloc] init]; 
    self.layer.mask = self.maskLayer; 
} 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    self.maskLayer.path = [self maskPath].CGPath; 
} 

- (UIBezierPath *)maskPath 
{ 
    return [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners: (UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(10.0, 10.0)]; 

} 

@end 
0

Я использую этот подкласс

.h

@interface UIView (custom) 

- (UIView *)setRoundedCorners:(UIRectCorner)corners withRadius:(CGFloat)radius; 

@end 

.m

@implementation UIView (custom) 

    - (UIView *)setRoundedCorners:(UIRectCorner)corners withRadius:(CGFloat)radius 
    { 
     UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds 
                 byRoundingCorners:corners 
                  cornerRadii:CGSizeMake(radius, radius)]; 

     CAShapeLayer *maskLayer = [CAShapeLayer layer]; 

     maskLayer.frame = self.bounds; 

     maskLayer.path = maskPath.CGPath; 

     self.layer.mask = maskLayer; 

     return self; 
    } 
@end 

С его помощью, как:

[YOURVIEW setRoundedCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerTopLeft | UIRectCornerTopRight withRadius:15]; 
Смежные вопросы