【问题标题】:CAShapeLayer in UIView SubclassUIView 子类中的 CAShapeLayer
【发布时间】:2015-09-23 14:38:00
【问题描述】:

我想用掩码创建UIView 的子类。我尝试使用drawRectlayoutSubviews 但没有成功,在这些尝试中没有出现视图。

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

我为此覆盖的方法是什么?我看到了很多类似问题的答案,但对我不起作用。

【问题讨论】:

    标签: ios objective-c uiview


    【解决方案1】:

    我为此找到了解决方案。我在我的视图中创建另一个视图并在她身上应用蒙版。

    代码:

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

    【讨论】:

    • 这不是一个合适的解决方案。在layoutSubview 中你唯一应该做的就是更新子视图的框架。你不应该画任何东西。您绝对应该layoutSubviews 中调用layoutIfNeeded
    猜你喜欢
    • 2016-08-22
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多