Как сделать кликабельной только круглую область кнопки, а не весь исходный прямоугольник

У меня есть метод, который рисует круглую кнопку на UIImageView. Кнопка отлично выглядит и отлично работает. Однако его кликабельная область — это не просто нарисованный для него круг, а весь исходный прямоугольник.

Вот метод кнопки в классе DrawMenu:

func drawButton(superImageView: UIImageView, delegate: ButtonDelegate, x_of_origin: CGFloat, y_of_origin: CGFloat, width_of_oval: CGFloat, height_of_oval: CGFloat, want_to_test_bounds:Bool) -> UIButton {

    var button = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
    button.addTarget(delegate, action: "buttonTap:", forControlEvents: UIControlEvents.TouchUpInside)

// THIS IS WHERE THE ORIGINAL RECT IS DEFINED, and it currently the clickable area
    button.frame = CGRect(x: x_of_origin, y: y_of_origin, width: width_of_oval, height: height_of_oval)

    button.clipsToBounds = true

 // This is where the look of circle is defined, and IS WHERE THE CLICKABLE AREA SHOULD BE 
    button.layer.cornerRadius = height_of_oval/2.0

    if (want_to_test_bounds == true) {
        button.layer.borderColor = UIColor.blackColor().CGColor
        button.layer.borderWidth = 1.0
    }
    return button
}

А вот вызов в ViewController:

override func viewDidLoad() {
    super.viewDidLoad()

    var drawMenu = DrawMenu()

    var newButton = drawMenu.drawButton(imageView, delegate: self, x_of_origin: 100, y_of_origin: 150, width_of_oval: 100, height_of_oval: 100, want_to_test_bounds: true)
    imageView.userInteractionEnabled = true
    imageView.addSubview(newButton)
}

Как всегда, любая помощь приветствуется. Благодарю вас

Редактировать после того, как он будет помечен как [дубликат]

Я понимаю, что вопрос iOS: неквадратные области нажатия для кнопок задает в основном тот же вопрос, и я благодарен за то, что меня направили на него.

Однако, после нескольких часов борьбы с проблемой, я считаю единственным решением поставленного вопроса, а именно:

«Вы можете добиться этого, создав подкласс UIButton и предоставив свой собственный:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
// return YES if point is inside the receiver’s bounds; otherwise, NO.
}

Документация Apple UIView предоставляет подробную информацию, например подтверждение того, что точка уже находится в системе координат приемника».

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

Конкретно:

1. Каковы в данном случае "границы получателя"? Это не могло быть связано с исходным прямоугольником, так как это дало бы мне тот же результат. Поэтому, вероятно, это return button.

2. Даже если бы это было так, как бы я мог реализовать это? pointInside: не может принимать дополнительные аргументы.

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

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

Еще раз спасибо.


person user2176152    schedule 11.09.2015    source источник
comment
Можете ли вы добавить скриншот того, как это будет выглядеть? Мне любопытно, сколько места за пределами кнопки в вашем UIImageView.   -  person Acludia    schedule 12.09.2015
comment
@rmaddy Спасибо, что направили меня на соответствующий вопрос. Если хотите, прочитайте мои правки и пересмотрите статус моего вопроса. Спасибо   -  person user2176152    schedule 12.09.2015
comment
Вот ответ, который показывает, как реализовать pointInside:withEvent: для круглой кнопки: stackoverflow.com/a/9336838/77567   -  person rob mayoff    schedule 12.09.2015
comment
@robmayoff Спасибо, я попытался реализовать часть вашего кода в Swift, но интерактивная область по-прежнему остается исходным прямоугольником. Я определил _path в классе, который является подклассом UIButton, и я переопределил layoutSubviews и добавил к нему var _path = UIBezierPath(ovalInRect: self.bounds). Затем создал функцию PathButton, которая содержит `var button = UIButton(frame: rect) button.layer.cornerRadius = height_of_oval/2.0 button.clipsToBounds = true var _path = UIBezierPath(ovalInRect: rect) `   -  person user2176152    schedule 13.09.2015
comment
Затем в func я добавляю кнопку в подпредставление, которое передается в подпредставление, затем вся функция возвращает путь. Затем реализуйте override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { return _path.containsPoint(point) }   -  person user2176152    schedule 13.09.2015
comment
Вы должны опубликовать новый вопрос верхнего уровня, содержащий ваш код и объясняющий, что пошло не так. Но в любом случае код в вашем комментарии показывает, что вы создаете запас UIButton, а не создаете экземпляр своего подкласса кнопок.   -  person rob mayoff    schedule 13.09.2015