Подтвердить что ты не робот

Как увеличить область выбора 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. Пожалуйста, ознакомьтесь с этой проблемой.

4b9b3361

Ответ 1

Это можно сделать, установив кнопку contentEdgeInsets, например:

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

Ответ 2

Для Swift

Вы можете переопределить func '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, 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)
}

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Для цели C

Создайте этот пользовательский класс UIButton и назначьте его в свою кнопку. Затем установите эти значения свойств из viewController.

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




#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

Ответ 7

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

xcode 9 screenshot

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

Ответ 8

Я бы создал UIView вокруг этой кнопки, чтобы вы могли установить размер по своему желанию. Затем я установил цвет фона UIView на прозрачный цвет (не устанавливайте непрозрачность 0, или жест не будет распознан)

Затем добавьте UIGestureRecognizer в uiview для обработки одного и того же IBAction

Конечно, многие люди будут поощрять/предпочитают использование edgeInsets

Ответ 9

Вот пример увеличения сенсорной области пользовательского 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];

Надеюсь, это было бы полезно.