2016-10-15 3 views
1

В каждой ячейке моего коллекционного вида находится круговой UIView. Это было достигнуто путем создания пользовательского подкласса UIView, который я назвал CircleView, и установки layer.cornerRadius = self.frame.size.width/2 в подклассе awakeFromNib()Распознаватель жестов по круговому виду

Я хочу, чтобы добавить жест распознавателя к каждому CircleView. Я делал это в вид коллекции cellForItemAtIndexPath:

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap(_:))) 
cell.circleView.addGestureRecognizer(gestureRecognizer) 

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

Я попытался решить эту проблему следующими способами:

В (нет эффекта) в CircleView в awakeFromNib() я установил self.clipsToBounds = true

Также в CircleView-х awakeFromNib() я поставил layer.masksToBounds = true (никакого эффекта)

Благодарим вас за ваши идеи и предложения.

+0

Вы исправили проблему с помощью предлагаемого решения? – alexburtnik

ответ

6

Вы можете переопределить этот метод в CircleView:

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
    let center = CGPoint(x: bounds.size.width/2, y: bounds.size.height/2) 
    return pow(center.x-point.x, 2) + pow(center.y - point.y, 2) <= pow(bounds.size.width/2, 2) 
} 

enter image description here

Все прикасается, не принадлежащие к кругу, будут игнорироваться.

Подробнее:

https://developer.apple.com/reference/uikit/uiview/1622469-hittest https://developer.apple.com/reference/uikit/uiview/1622533-point

Главное в том, что вам не нужно вызывать ни hitTest, ни pointInside методы, вы просто переопределить их в пользовательской точки зрения и система будет вызывать когда ему нужно знать, следует ли касаться этого представления.

В вашем случае у вас есть UITableViewCell с CircleView в нем, не так ли? Вы добавили распознаватель жестов в CircleView и перезагрузите метод pointInside, поэтому прикосновение будет обработано самим CircleView, если точка касания находится внутри круга, иначе событие будет передано дальше, обрабатывается ячейкой, и поэтому будет вызываться didSelectRowAtIndexPath.

+0

Спасибо за ваш ответ. Я добавил эту функцию в CircleView, но не знаю, как ее использовать. Я пробовал два пути. 1) Получение местоположения крана с помощью 'let tapLocation = gestureRecognizer.location (in: self.view)'. Но теперь я не знаю, как передать его в функцию, чтобы проверить, находится ли она внутри круга. 2) Я могу вместо этого использовать представление коллекции 'didSelectItemAtIndexPath', здесь я могу получить доступ к функции с помощью' cell.circleView.point', но с этой опцией я не понимаю, как получить место для подключения кран. –

+0

Кстати, изображение очень полезно для понимания _how_ код работает. Благодаря! Я просто не знаю, как использовать его в связи с распознавателем жестов (или сделал вид коллекций didSelectItemAtIndexPath .. либо будет работать!) –

+0

@AustinWood Вы не должны передавать местоположение крана вручную при таком подходе. Если вы переопределите метод pointInside', он будет вызван автоматически, когда потребуется. См. Обновленный ответ. – alexburtnik

 Смежные вопросы

  • Нет связанных вопросов^_^