it-roy-ru.com

Как увеличить зону выбора UIButton?

Я сделал 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];

enter image description here

Это выглядит как правая кнопка на изображении выше. Теперь требуется, чтобы область выбора этой кнопки была больше, чем изображение uibutton. Так что пользователь сможет легко нажать кнопку, коснувшись области рядом с определенной кнопкой. 

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

Я попытался установить image inset, но он сделал image irregular. Пожалуйста, посмотрите на эту проблему.

28
Minkle Garg

Вы можете добиться этого, установив кнопку contentEdgeInsets, например:

toggleButton.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0); //set as you require 
44
Nitin Gohel

Для Свифта

Вы можете переопределить функцию 'pointInside' класса UIView, чтобы расширить область, на которую можно кликать.

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, ширина: 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)
}
16
Mark

в Xcode 9 вы можете сделать следующее:

 xcode 9 screenshot

это означает, что вы должны компенсировать смещение изображения и смещение содержимого, чтобы обеспечить центрирование изображения.

3
Olli D-Metz

Попробуйте использовать свойство contentEdgeInsets кнопки UIButton .

3
Adithya

Код ниже решает мою проблему. Это очень простой способ, Попробуйте это:

    button.contentEdgeInsets = UIEdgeInsetsMake(15, 20, 10, 10);  //Change x,y,width,height as per your requirement.
2
Suraj Sonawane

Для цели 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
1
Syed Sadrul Ullah Sahad

В моем случае изображение кнопки маленькое, и я хочу увеличить область кнопки, не увеличивая размер изображения 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)];
0
i.AsifNoor