绘制多边形和不规则按钮。要结合上次提到的贝塞尔曲线和CAShapeLayer,去绘制你想要的形状。然后通过layer层的遮罩mask,进行设置,但仅仅这样是不够的,没有遮挡的部分也会响应点击。所以要重写Button的这个方法:pointInside,之后会详细介绍
先简单介绍一下遮罩mask这个属性:
比如layerA是layerB的mask,即layerB.mask = layerA; 那么layerA上透明的部分,会被绘制成白色挡住layerB(貌似都是白色,不知道能不能弄成其他颜色); layerA上不透明的部分,会被绘制成透明,显示出layerB的内容
即把你用贝塞尔曲线绘制的shapeLayer赋给button的layer.mask就OK了。
然后介绍一下 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event:点击button时,会回调这个方法,参数是你点击的坐标。在里面判断该坐标点是否在path内,YES则响应,NO则不响应。
自定义封装的Button:
ViewController:
先简单介绍一下遮罩mask这个属性:
比如layerA是layerB的mask,即layerB.mask = layerA; 那么layerA上透明的部分,会被绘制成白色挡住layerB(貌似都是白色,不知道能不能弄成其他颜色); layerA上不透明的部分,会被绘制成透明,显示出layerB的内容
即把你用贝塞尔曲线绘制的shapeLayer赋给button的layer.mask就OK了。
然后介绍一下 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event:点击button时,会回调这个方法,参数是你点击的坐标。在里面判断该坐标点是否在path内,YES则响应,NO则不响应。
自定义封装的Button:
//绘制按钮时添加path遮罩
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
CAShapeLayer *shapLayer = [CAShapeLayer layer];
shapLayer.path = self.path.CGPath;
self.layer.mask = shapLayer;
}
//覆盖方法,点击时判断点是否在path内,YES则响应,NO则不响应
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
BOOL res = [super pointInside:point withEvent:event];
if (res)
{
if ([self.path containsPoint:point])
{
return YES;
}
return NO;
}
return NO;
}
ViewController: