UIViewController
наследуется от UIResponder
, поэтому наивным способом (я уверен, что это не самый умный способ сделать это) было бы переписать следующие методы (как минимум 1 из них)
– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
- touchesCancelled:withEvent:
Далее вы можете получить потроганный вид, выполнив
UITouch *touch = [touches anyObject];
UIView *touchedView = [touch view];
наконец, подать в отставку первого респондента, если это представление не ваше текстовое поле
if(touchedView != textField){
[textField resignFirstResponder];
}
_
Недостатки этого подхода:
Вам придется самостоятельно справиться с «краном». (Та же проблема, что и у старой iOS 3.1 или более ранней). Вам придется придумать свою собственную реализацию, чтобы отличить отдельные касания от перетаскивания, пролистывания, двойного касания, длинных касаний и т. Д. Не сложно заставить его работать хорошо, но вряд ли вы получите его точно так же, как Apple обнаруживает касания (время, расстояния, пороги считаются!)
Однако это зависит от ваших потребностей.
Если ваша структура представления достаточно проста, вы можете добавить распознаватель жестов в представление контейнера и отставить первого респондента каждый раз, когда вызывается обработчик:)
Надеюсь, это поможет