iPhone:覆盖UIButton buttonWithType以返回子类

时间:2010-04-01 18:33:34

标签: iphone uibutton subclass

我希望能够创建一个具有超大响应区域的UIButton。我知道一种方法是覆盖子类中的hitTest方法,但是如何首先实例化我的自定义按钮对象?

[OversizedButton buttonWithType: UIButtonTypeDetailDisclosure];

开箱即用,因为buttonWithType返回的是UIButton,而不是OversizedButton。

所以我似乎也需要覆盖buttonWithType方法。有谁知道怎么做?

@implementation OversizedButton

+ (id)buttonWithType:(UIButtonType)buttonType
{
   // Construct and return an OversizedButton rather than a UIButton
   // Needs to handle special types such as UIButtonTypeDetailDisclosure
   // I NEED TO KNOW HOW TO DO THIS PART
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{
   // Return results if touch event was in oversized region
   // I ALREADY KNOW HOW TO DO THIS PART
}

@end

或者,也许我可以使用alloc / initWithFrame创建按钮。但是buttonType属性是readonly,那么如何创建自定义按钮类型?

注意:我知道还有其他方法可以做到这一点,例如在可见的按钮后面有一个隐形按钮。我不关心这种方法,宁愿避免它。对上述方法的任何帮助都会非常有帮助。感谢

3 个答案:

答案 0 :(得分:3)

UIButton buttonWithType:会返回UIButtonUIRoundedRectButton,具体取决于type参数的值。

由于UIButton未提供initWithType:方法,我认为尝试覆盖buttonWithType:会很危险。

我建议你改为子类UIControl。然后,您可以将一个按钮作为子视图添加到控件中,并拦截hitTest:withEvent:

答案 1 :(得分:1)

我是这样做的:

+ (instancetype)customButtonWithCustomArgument:(id)customValue {
    XYZCustomButtom *customButton = [super buttonWithType:UIButtonTypeSystem];
    customButton.customProperty = customValue;
    [customButton customFunctionality];
    return customButton;
}

也适用于其他类型,UIButtonTypeSystem只是一个例子。

答案 2 :(得分:0)

在UIKit的任何地方都没有使用buttonType属性,在您的代码中,您始终可以检查-isKindOfClass:,因此覆盖此属性的+buttonWithType:是相当无意义的IMO。只需使用

return [[[OversizedButton alloc] initWithFrame:...] autorelease];

(您可以使用未记录的方法_setButtonType:覆盖按钮类型。)