如何增加UIButton的选择范围?

Min*_*arg 28 objective-c uibutton ios

我已经以UIButton编程方式完成了

togglebutton = [UIButton buttonWithType:UIButtonTypeCustom];
togglebutton.frame = CGRectMake(42, 15, 80, 21);
[togglebutton addTarget:self action:@selector(toggleview)   
forControlEvents:UIControlEventTouchUpInside];
[togglebutton setImage:[UIImage imageNamed:@"squ.png"] forState:UIControlStateNormal];
[buttonView addSubview:togglebutton];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

它在上图中看起来是右键.现在的要求是该按钮的选择区域应该大于uibutton图像.这样用户就可以通过触摸特定按钮的区域来轻松点击按钮.

[togglebutton setImageEdgeInsets: UIEdgeInsetsMake( 0, -30, 0, -25)];
Run Code Online (Sandbox Code Playgroud)

我试图设置它image inset但它正在制作image irregular.请看这个问题.

Nit*_*hel 46

您可以通过设置按钮来实现此目的contentEdgeInsets,例如:

toggleButton.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0); //set as you require 
Run Code Online (Sandbox Code Playgroud)

  • 根据属性声明,您需要插入的负值来增加选择区域.使用此属性可以调整按钮内容的有效绘图矩形并重新定位.内容包括按钮图像和按钮标题.您可以为四个插图(顶部,左侧,底部,右侧)中的每一个指定不同的值.正值会缩小或缩小,使其靠近按钮的中心.负值会扩展或偏离该边缘. (6认同)

Mar*_*ark 17

对于斯威夫特

您可以覆盖UIView类的func'pointInside'以扩展可点击区域.

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    // padding : local variable of your custom UIView, CGFloat
    // you can change clickable area dynamically by setting this value.

    let newBound = CGRect(
        x: self.bounds.origin.x - padding,
        y: self.bounds.origin.y - padding,
        width: self.bounds.width + 2 * padding,
        height: self.bounds.height + 2 * padding
    )
    return CGRectContainsPoint(newBound, point)
}
Run Code Online (Sandbox Code Playgroud)

像这样使用,

class MyButton: UIButton {
    var padding = CGFloat(0) // default value

    //func pointInside at here!!
}
Run Code Online (Sandbox Code Playgroud)

初始化按钮时,请设置自定义填充.

func initButton() {
    let button = MyButton(frame: CGRect(x: 100, y: 100, width: 30, height: 30))
    button.padding = 10 // any value you want
    view.addSubview(button)
}
Run Code Online (Sandbox Code Playgroud)

然后你的按钮在框架中(x:100,y:100,宽度:30,高度:30)

并且您的按钮的可点击区域可能位于框架中(x:90,y:90,宽度:50,高度:50)

**请务必检查与任何其他视图的重叠,因为其可点击区域大于其外观.

Swift 3的更新

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    let padding = CGFloat(10)
    let extendedBounds = bounds.insetBy(dx: -padding, dy: -padding)
    return extendedBounds.contains(point)
}
Run Code Online (Sandbox Code Playgroud)

  • 这是与自动布局一起使用的理想解决方案. (3认同)