28

我以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];

在此处输入图像描述

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

[togglebutton setImageEdgeInsets: UIEdgeInsetsMake( 0, -30, 0, -25)];

我试图设置,image inset但它使image irregular. 请看这个问题。

4

9 回答 9

47

您可以通过设置按钮的 来实现这一点contentEdgeInsets,例如:

toggleButton.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0); //set as you require 
于 2013-06-22T09:47:20.363 回答
18

对于斯威夫特

您可以覆盖 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)
}

像这样使用,

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

    //func pointInside at here!!
}

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

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)
}

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

并且您的按钮的可点击区域可能在框架中 (x: 90, y: 90, width: 50, height: 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)
}
于 2015-12-29T05:51:29.357 回答
3

尝试使用UIButtoncontentEdgeInsets的属性。

于 2013-06-22T09:19:03.893 回答
3

在 xcode 9 中,您可以执行以下操作:

xcode 9 截图

这意味着您必须补偿图像偏移和内容偏移以确保居中的图像定位。

于 2017-12-07T15:15:26.977 回答
2

下面的代码解决了我的问题。这是非常基本的方法,试试这个:

    button.contentEdgeInsets = UIEdgeInsetsMake(15, 20, 10, 10);  //Change x,y,width,height as per your requirement.
于 2015-12-05T11:58:56.240 回答
1

对于目标 C

创建此自定义 UIButton 类并将其分配给您的按钮。然后从 viewController 设置这些属性值。

//This is .h file
     #import <UIKit/UIKit.h>
        @interface CustomButton : UIButton
        @property (nonatomic) CGFloat leftArea;
        @property (nonatomic) CGFloat rightArea;
        @property (nonatomic) CGFloat topArea;
        @property (nonatomic) CGFloat bottomArea;
        @end



        //.m file is following
        #import "CustomButton.h
        @implementation CustomButton

        -(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
        {
            CGRect newArea = CGRectMake(self.bounds.origin.x - _leftArea, self.bounds.origin.y - _topArea, self.bounds.size.width + _leftArea + _rightArea, self.bounds.size.height + _bottomArea + _topArea);

            return CGRectContainsPoint(newArea, point);
        }
        @end
于 2017-11-12T07:21:04.243 回答
0

就我而言,我的按钮图像很小,我想增加按钮区域而不增加uibutton图像大小,因为它看起来很模糊。所以我增加了按钮框架,然后设置按钮图像setImageEdgeInsets。的正值edgeInsets将缩小,负值将扩大。

self.menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.menuButton addTarget:self
                  action:@selector(onSideBarButtonTapped:)
        forControlEvents:UIControlEventTouchDown];
[self.menuButton setImage:[UIImage imageNamed:@"menu"]
                         forState:UIControlStateNormal];
self.menuButton.frame = CGRectMake(10, 3, 40, 40);

现在我要缩小图像大小,这样按钮就不会看起来模糊了。

[self.menuButton setImageEdgeInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
于 2015-12-05T05:13:07.650 回答
-2

这是增加自定义 UIButton 的可触摸区域的示例:

UIImage *ButtonImage=[UIImage imageNamed:@"myimage.png"];
UIButton *myButton=[UIButton buttonWithType:UIButtonTypeCustom];
myButton.frame=CGRectMake(10, 25, ButtonImage.size.width/2+10, ButtonImage.size.height/2+10);
[myButton setImage:ButtonImage forState:UIControlStateNormal];
myButton.imageEdgeInsets = UIEdgeInsetsMake(5, 5, 5, 5);
[myButton addTarget:self action:@selector(crossButtonClick:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:myButton];

希望它会有所帮助。

于 2014-11-03T09:29:50.307 回答
-2

我会围绕该按钮创建一个 UIView,以便您可以将大小设置为任何您想要的。然后我将 UIView 的背景颜色设置为清晰的颜色(不要将不透明度设置为 0,否则将无法识别手势)

然后在uiview中添加一个UIGestureRecognizer来处理同样的IBAction

当然,很多人会鼓励/更喜欢使用 edgeInsets

于 2013-10-29T19:02:36.403 回答