可可触摸 - 自定义UIButton形状

时间:2010-11-12 05:50:14

标签: objective-c ios cocoa-touch

如何使可触摸按钮区域与所提供图像的形状相同?
假设我有一个带有三角形图像的自定义按钮,如何确保只处理该三角形内的触摸。

或者我是否必须在触摸动作功能中进行某种数学运算?

3 个答案:

答案 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的透明背景部分中删除了一些动作。我将此添加到我的项目中,并能够通过这些步骤启动并运行。

  1. 下载项目
  2. 将UIImage + ColorAtPixel.h / m和OBShapedButton.h / m文件添加到项目文件夹
  3. 确保将.m文件添加到目标的Build Phases>编译来源列表
  4. 将所有按钮的UIButton类类型更改为IB中的OBShapedButton类
  5. 确保您的.png文件具有透明背景,并使其成为按钮的“图像”
  6. 这个项目将帮助任何拥有多个重叠UIButton的具有透明背景的人,即使他们在不同的UIViews中或完全被另一个UIButton覆盖(例如,你不能在IB中选择它而没有编辑器> Arrange>发送到后面/前面)。但是,如果在UIView中有一个OBShapedButton,透明UIView的一部分与OBShapedButton重叠,则无法在OBShapedButton的UIView覆盖部分上接收click或drag事件,因此请记住UIViews。 / p>

    下载Ole和viking的教程集项目...... DO IT!