Intereting Posts

ViewController вызывает touchhesMoved только один раз

У меня есть вопрос, который я искал, но не могу найти окончательный ответ. Вот мой макет:

UIView - ViewController |_UIScrollView - added programatically | |_UIView to hold a backgound/perimeter - added programmatically |_UIView 1 - added programmatically |_UIView 2 - added programmatically and so on 

Мой вопрос в том, почему ViewController называет «touchhesMoved» только один раз, когда я двигаюсь, говорю UIView 2 при прикосновении?

Теперь UIView имеет свой собственный метод touchhesMoved, но мне нужны приказы контроллера, которые нужно вызвать, чтобы мне было нужно поговорить с ScrollView, чтобы обновить его позицию. Например, когда UIView 2 находится около угла, так что ScrollView немного движется, чтобы полностью показать UIView 2.

Если нет способа обойти это, можно обновить ScrollView из UIView 2, чтобы прокручивать его, когда он находится рядом с углом?

Редактировать:

Кажется, я нашел работу. Не уверен, что это будет принято Apple, но:

Я только что позвонил в переменную экземпляра, которая равна = self.superview, которая затем позволяет мне вернуться к моему ScrollView в касаниях UIViewMoved

в том, что я могу вызвать метод [ScrollView setContentOffset: (CGPoint) contentOffset анимированный: (BOOL) анимированный], поэтому мой ScrollView обновляется по мере того, как subview (UIView2) перемещается близко к краю UIWindow.

Спасибо за предложения.

Поведение, которое вы описываете, является результатом UIScrollView захватив событие, UIScrollView с касанием. Другими словами, как только UIScrollView обнаружит, что событие с перемещением касания попадает в его фрейм, он контролирует его. Я испытал такое же поведение, пытаясь создать специальный обработчик, и он провалился каждый раз, когда UIScrollView также интересовался салфетки.

В моем случае я решил проблему, перехватив событие в sendEvent: переопределенное в моем пользовательском UIWindow , но я не знаю, хотите ли вы сделать то же самое. В любом случае, это то, что сработало для меня:

 - (void)sendEvent:(UIEvent*)event { NSSet* allTouches = [event allTouches]; UITouch* touch = [allTouches anyObject]; UIView* touchView = [touch view]; //-- UIScrollViews will make touchView be nil after a few UITouchPhaseMoved events; //-- by storing the initialView getting the touch, we can overcome this problem if (!touchView && _initialView && touch.phase != UITouchPhaseBegan) touchView = _initialView; //-- do your own management of the event //-- let the event propagate if you want also the default event management [super sendEvent:event]; } 

Альтернативный подход, который вы можете исследовать, заключается в прикреплении распознавателя жестов к вашим представлениям – они имеют довольно высокий приоритет, поэтому, возможно, UIScrollView не будет с ними общаться, и он может работать лучше для вас.

Если нет способа обойти это, можно обновить ScrollView из UIView 2, чтобы прокручивать его, когда он находится рядом с углом?

Вы пытались сделать прокрутку UIScrollView , позвонив:

 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated