У меня есть метод, который рисует круглую кнопку на 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: неквадратные области нажатия для кнопок.
Еще раз спасибо.
pointInside:withEvent:
для круглой кнопки: stackoverflow.com/a/9336838/77567 - person rob mayoff   schedule 12.09.2015layoutSubviews
и добавил к нему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.2015override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { return _path.containsPoint(point) }
- person user2176152   schedule 13.09.2015UIButton
, а не создаете экземпляр своего подкласса кнопок. - person rob mayoff   schedule 13.09.2015