UIButton: увеличение области попадания по умолчанию - PullRequest
183 голосов
/ 30 апреля 2009

У меня есть вопрос, касающийся UIButton и его области попадания. Я использую кнопку Info Dark в конструкторе интерфейсов, но обнаружил, что область попадания недостаточно велика для пальцев некоторых людей.

Есть ли способ увеличить область нажатия кнопки программно или в Интерфейсном Разработчике без изменения размера графического элемента InfoButton?

Ответы [ 34 ]

0 голосов
/ 06 ноября 2014

Я так опоздал к этой игре, но хотел взвесить простую технику, которая может решить ваши проблемы. Вот типичный программный фрагмент UIButton для меня:

UIImage *arrowImage = [UIImage imageNamed:@"leftarrow"];
arrowButton = [[UIButton alloc] initWithFrame:CGRectMake(15.0, self.frame.size.height-35.0, arrowImage.size.width/2, arrowImage.size.height/2)];
[arrowButton setBackgroundImage:arrowImage forState:UIControlStateNormal];
[arrowButton addTarget:self action:@selector(onTouchUp:) forControlEvents:UIControlEventTouchUpOutside];
[arrowButton addTarget:self action:@selector(onTouchDown:) forControlEvents:UIControlEventTouchDown];
[arrowButton addTarget:self action:@selector(onTap:) forControlEvents:UIControlEventTouchUpInside];
[arrowButton addTarget:self action:@selector(onTouchUp:) forControlEvents:UIControlEventTouchDragExit];
[arrowButton setUserInteractionEnabled:TRUE];
[arrowButton setAdjustsImageWhenHighlighted:NO];
[arrowButton setTag:1];
[self addSubview:arrowButton];

Я загружаю прозрачное изображение PNG для своей кнопки и устанавливаю фоновое изображение. Я устанавливаю кадр на основе UIImage и масштабирую на 50% для сетчатки. Хорошо, может быть, вы согласны с вышеизложенным или нет, НО, если вы хотите сделать область удара БОЛЬШЕ и избавить себя от головной боли:

Что я делаю, откройте изображение в фотошопе и просто увеличьте размер холста до 120% и сохраните. Фактически вы только что увеличили изображение с помощью прозрачных пикселей.

Только один подход.

0 голосов
/ 13 апреля 2016

Ни один из ответов не работает идеально для меня, потому что я использую фоновое изображение и заголовок на этой кнопке. Кроме того, размер кнопки будет изменяться при изменении размера экрана.

Вместо этого я увеличиваю область касания, увеличивая прозрачную область png.

0 голосов
/ 20 июля 2016

Swift:

override func viewWillAppear(animated: Bool) {
        self.sampleButton.frame = CGRectInset(self.sampleButton.frame, -10, -10);
    }
0 голосов
/ 21 июня 2016

Эта версия Swift позволяет вам определять минимальный размер удара для всех кнопок UIB. Важно также то, что он обрабатывает случай, когда кнопки UIB скрыты, и многие ответы игнорируются.

extension UIButton {
    public override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        // Ignore if button hidden
        if self.hidden {
            return nil
        }

        // If here, button visible so expand hit area
        let hitSize = CGFloat(56.0)
        let buttonSize = self.frame.size
        let widthToAdd = (hitSize - buttonSize.width > 0) ? hitSize - buttonSize.width : 0
        let heightToAdd = (hitSize - buttonSize.height > 0) ? hitSize - buttonSize.height : 0
        let largerFrame = CGRect(x: 0-(widthToAdd/2), y: 0-(heightToAdd/2), width: buttonSize.width+widthToAdd, height: buttonSize.height+heightToAdd)
        return (CGRectContainsPoint(largerFrame, point)) ? self : nil
    }
}
...