我已经搜索过一个问题,但找不到明确的答案。这是我的布局:
UIView - ViewController
|_UIScrollView - added programatically
| |_UIView to hold a backgound/perimeter - added programmatically
|_UIView 1 - added programmatically
|_UIView 2 - added programmatically
and so on
我的问题是,当我移动说 UIView 2 on touch 时,为什么 ViewController 只调用一次“touchesMoved”?
现在 UIView 有它自己的 touchesMoved 方法,但我需要调用 Controller 的 touchesMoved,因为我需要它与 ScrollView 对话以更新其位置。比如当那个 UIView 2 靠近拐角的时候,让 ScrollView 稍微移动一下就可以完全显示 UIView 2。
如果没有办法解决这个问题,有没有办法从 UIView 2 更新 ScrollView 以在靠近角落时滚动?
编辑:
我想我可能已经找到了解决办法。不确定这是否会被 Apple 接受,但是:
我刚刚调用了一个实例变量,即 = self.superview,然后我可以在 UIView 的 touchesMoved 中与我的 ScrollView 对话
因为我可以调用方法 [ScrollView setContentOffsetCGPoint)contentOffset animatedBOOL)animated] 所以当 subview (UIView2) 靠近 UIWindow 的边缘时,我的 ScrollView 会得到更新。
感谢您的建议。
Best Answer-推荐答案 strong>
您描述的行为是 UIScrollView 劫持触摸移动事件的结果。换句话说,一旦 UIScrollView 检测到触摸移动事件落在其框架内,它就会控制它。我在尝试创建一个特殊的滑动处理程序时遇到了同样的行为,每次 UIScrollView 也对滑动感兴趣时它都会失败。
在我的例子中,我通过拦截 sendEvent: 中的事件解决了这个问题,该事件在我的自定义 UIWindow 中被覆盖,但我不知道你是否想这样做相同的。无论如何,这对我有用:
- (void)sendEventUIEvent*)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];
}
您可能会研究的另一种方法是将 手势识别器 附加到您的 View - 它们具有相当高的优先级,因此 UIScrollView 可能不会干扰它们,它可能对您更有效.
If there is no way around this is there a way to update ScrollView from UIView 2 to scroll when its near a corner?
您是否尝试通过调用使 UIScrollView 滚动:
- (void)setContentOffsetCGPoint)contentOffset animatedBOOL)animated
关于objective-c - ViewController 只调用一次 touchesMoved,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/12427733/
|