viewDidLayoutSubviews вызывается после touchSegan - снова и снова
В игре в слова iPhone у меня есть UIScrollView
(держа UIImageView
) и 7 перетаскиваемых пользовательских UIView
s изначально размещены внизу (и за пределами вида прокрутки):
В единственном ViewController.m я перезаписал viewDidLayoutSubviews
так что он всегда устанавливает zoomScale
вида прокрутки - чтобы иметь UIImageView
заполнить ровно 100% ширины экрана.
Это хорошо работает - для портретного и ландшафтного режимов. И когда приложение только запускается:
Однако моя проблема заключается в том, что когда я сначала сжимаю / масштабирую / дважды нажимаю на представление прокрутки, а затем перемещаю один из семи видов Tile.m:
Внезапно (не каждый раз) viewDidLayoutSubviews
называется после touchesBegan
,
Это сбрасывает масштаб представления прокрутки - неожиданно для пользователя.
У меня вопрос, есть ли способ отключить это поведение?
Можно ли предотвратить viewDidLayoutSubviews
вызов родителя, когда его ребенок UIView
дотрагивается?
ОБНОВИТЬ:
Я переместил zoomScale
установочный код из viewDidLayoutSubviews
в didRotateFromInterfaceOrientation
и масштабирование прокрутки в порядке, но его contentOffset
сбрасывается на {0,0}
, когда (не всегда) я перетаскиваю плитку - то есть вид прокрутки внезапно скачет, приложение непригодно для использования.
Добавление следующего к viewDidLoad
не помогло:
if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)])
self.automaticallyAdjustsScrollViewInsets = NO;
1 ответ
viewDidLayoutSubviews
вызывается всякий раз, когда система выполняет макет в представлении (layoutSubviews
). Это может быть вызвано множеством причин; Вы можете создать подкласс своего представления, реализовать пустой layoutSubviews
метод (не забудьте вызвать super
реализация!) и поставить точку останова, чтобы увидеть, кто вызывает макет. Вы также можете реализовать setNeedsLayout
а также layoutIfNeeded
и поставьте там точки останова также для вашего исследования, так как они запускают макет последующих циклов выполнения.
Но вы никогда не сможете предотвратить макет. Система выполняет макет во многих случаях, которые находятся вне вашего контроля. Например, если пользователь звонит, существует приложение телефона и возвращается в ваше приложение; макет срабатывает, потому что границы и рамка окна изменились. Звонок заканчивается; макет снова срабатывает, потому что теперь окно вернулось к предыдущему размеру.
Вы должны нести ответственность за выяснение того, когда устанавливать масштаб увеличения. Например, если пользователь запускает жест, вы должны указать своему коду не вносить изменения, даже если макет был выполнен.