如何使可触摸按钮区域与所提供图像的形状相同?
假设我有一个带有三角形图像的自定义按钮,如何确保只处理该三角形内的触摸。
或者我是否必须在触摸动作功能中进行某种数学运算?
答案 0 :(得分:3)
OBShapedButton是一个很棒的项目
它通过继承UIButton并覆盖-pointInside:withEvent:
@implementation OBShapedButton
// UIView uses this method in hitTest:withEvent: to determine which subview
// should receive a touch event.
// If pointInside:withEvent: returns YES, then the subview’s hierarchy is
// traversed; otherwise, its branch
// of the view hierarchy is ignored.
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
// Return NO if even super returns NO (i.e. if point lies outside our bounds)
BOOL superResult = [super pointInside:point withEvent:event];
if (!superResult) {
return superResult;
}
// We can't test the image's alpha channel if the button has no image.
// Fall back to super.
UIImage *buttonImage = [self imageForState:UIControlStateNormal];
if (buttonImage == nil) {
return YES;
}
CGColorRef pixelColor = [[buttonImage colorAtPixel:point] CGColor];
CGFloat alpha = CGColorGetAlpha(pixelColor);
return alpha >= kAlphaVisibleThreshold;
}
@end
[aUIImage colorAtPixel:point]
是附加的类别方法。
答案 1 :(得分:1)
与UIButton相关的核心可可触摸类绝对不提供此功能。我猜你必须调查子类化UIButton并截取你提到的水龙头。
答案 2 :(得分:1)
Ole的OBShapedButton项目应该在SO上引用更多。感谢vikingosegundo,过去曾帮助过my-programming-examples github,你可以看到Ole把一些东西放在一起,从自定义UIButton的透明背景部分中删除了一些动作。我将此添加到我的项目中,并能够通过这些步骤启动并运行。
这个项目将帮助任何拥有多个重叠UIButton的具有透明背景的人,即使他们在不同的UIViews中或完全被另一个UIButton覆盖(例如,你不能在IB中选择它而没有编辑器> Arrange>发送到后面/前面)。但是,如果在UIView中有一个OBShapedButton,透明UIView的一部分与OBShapedButton重叠,则无法在OBShapedButton的UIView覆盖部分上接收click或drag事件,因此请记住UIViews。 / p>
下载Ole和viking的教程集项目...... DO IT!