Почему это происходит?
Это связано с тем, что, когда ваше подчиненное представление находится за пределами границ вашего супервизора, события касания, которые на самом деле происходят в этом подчиненном представлении, не будут доставлены в это подчиненное представление. Тем не менее, он БУДЕТ передан его супервизору.
Независимо от того, обрезаны ли подвиды визуально, события касания всегда учитывают прямоугольник границ надпредставления целевого вида. Другими словами, события касания, происходящие в части представления, которая находится за пределами прямоугольника границ супервизора, не доставляются в это представление. Ссылка на сайт
Что тебе необходимо сделать?
Когда ваш супервизор получит упомянутое выше событие касания, вам нужно будет явно указать UIKit, что мое подчиненное представление должно получать это событие касания.
А как насчет кода?
В вашем супервизоре реализовать func hitTest(_ point: CGPoint, with event: UIEvent?)
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if isHidden || alpha == 0 || clipsToBounds { return super.hitTest(point, with: event) }
let subviewPoint = self.convert(point, to: subview)
if !subview.isHidden && subview.bounds.contains(subviewPoint) { return subview }
return super.hitTest(point, with: event)
}
Захватывающий готчя: вы должны перейти в "высший слишком-маленький супервизор"
Вы должны подняться «вверх» к «самому высокому» обзору, за пределами которого находится вид проблемы.
Типичный пример:
Скажем, у вас есть экран S с представлением контейнера C. Вид контроллера представления контейнера - V. (Напомним, что V будет находиться внутри C и иметь такой же размер.) V имеет подпредставление (возможно, кнопку) B. B - проблема вид, который фактически находится за пределами В.
Но обратите внимание, что B также находится за пределами C.
В этом примере вы должны применить решение override hitTest
на самом деле С, не к V . Если применить его к V - ничего не произойдет.