2015-09-23 2 views
0

Я хочу создать подкласс UIView с маской. Я пробовал использовать drawRect и layoutSubviews, но не успел, в тезисы попытки вид не появляется.CAShapeLayer в подклассе UIView

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    UIBezierPath *path = [UIBezierPath new]; 
    [path moveToPoint:(CGPoint){self.frame.origin.x + 10, self.frame.origin.y}]; 
    [path addLineToPoint:(CGPoint){self.frame.origin.x + self.frame.size.width, self.frame.origin.y}]; 
    [path addLineToPoint:(CGPoint){self.frame.origin.x + self.frame.size.width, self.frame.origin.y + self.frame.size.height}]; 
    [path addLineToPoint:(CGPoint){self.frame.origin.x +10, self.frame.origin.y + self.frame.size.height}]; 
    [path addLineToPoint:(CGPoint){self.frame.origin.x +10, self.frame.origin.y + (self.frame.size.height/2) + 5}]; 
    [path addLineToPoint:(CGPoint){self.frame.origin.x , self.frame.origin.y + (self.frame.size.height/2)}]; 
    [path addLineToPoint:(CGPoint){self.frame.origin.x +10, self.frame.origin.y + (self.frame.size.height/2) - 5}]; 
    [path closePath]; 
    CAShapeLayer *mask = [CAShapeLayer new]; 
    mask.frame = self.bounds; 
    mask.path = path.CGPath; 
    self.layer.mask = mask; 
} 

Каков метод, который у меня есть для этого? Я вижу очень ответы на подобные вопросы, но не работаю для меня.

ответ

0

Я нахожу решение для этого. Я создаю другое представление внутри своего представления и применяю маску в ней.

Код:

@interface BubbleView() 

@property (nonatomic, strong) UIView *maskView; 

@end 
@implementation BubbleView 


-(id) initWithCoder:(NSCoder *)aDecoder { 

    self = [super initWithCoder:aDecoder]; 

    self.maskView = [[UIView alloc] init]; 
    [self addSubview:self.maskView]; 
    self.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.0]; 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 

    self.maskView.frame = self.bounds; 
    self.maskView.backgroundColor = [UIColor whiteColor]; 

    [super drawRect:rect]; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    UIBezierPath *path = [UIBezierPath new]; 
    [path moveToPoint:(CGPoint){self.maskView.frame.origin.x + 10, self.maskView.frame.origin.y}]; 
    [path addLineToPoint:(CGPoint){self.maskView.frame.origin.x + self.maskView.frame.size.width, self.maskView.frame.origin.y}]; 
    [path addLineToPoint:(CGPoint){self.maskView.frame.origin.x + self.maskView.frame.size.width, self.maskView.frame.origin.y + self.maskView.frame.size.height}]; 
    [path addLineToPoint:(CGPoint){self.maskView.frame.origin.x +10, self.maskView.frame.origin.y + self.maskView.frame.size.height}]; 
    [path addLineToPoint:(CGPoint){self.maskView.frame.origin.x +10, self.maskView.frame.origin.y + (self.maskView.frame.size.height/2) + 5}]; 
    [path addLineToPoint:(CGPoint){self.maskView.frame.origin.x , self.maskView.frame.origin.y + (self.maskView.frame.size.height/2)}]; 
    [path addLineToPoint:(CGPoint){self.maskView.frame.origin.x +10, self.maskView.frame.origin.y + (self.maskView.frame.size.height/2) - 5}]; 
    [path closePath]; 

    CAShapeLayer *mask = [CAShapeLayer new]; 
    mask.frame = self.maskView.bounds; 
    mask.path = path.CGPath; 
    self.maskView.layer.mask = mask; 

    [self layoutIfNeeded]; 

} 
+0

Это не правильное решение. Единственное, что вы должны сделать в 'layoutSubview', - это обновление фреймов subviews. Вы не должны рисовать. И вы должны обязательно * не * называть 'layoutIfNeeded' внутри' layoutSubviews'. – rmaddy

Смежные вопросы