我有一个问题,我已经搜索过,但无法找到一个明确的答案。这是我的布局:
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时,ViewController如何调用“touchesMoved”一次?
现在UIView拥有它自己的touchesMoved方法,但我需要控制器的touchesMoved来调用,因为我需要它与ScrollView交谈来更新它的位置。比如当UIView 2接近角落时,ScrollView会移动一点以完全显示UIView 2。
如果无法解决这个问题,有没有办法从UIView 2更新ScrollView,以便在靠近角落时滚动?
编辑:
我想我可能找到了解决方法。不确定这是否会被Apple接受,但是:
我刚刚调用了一个实例变量= self.superview,然后允许我在UIView的touchesMoved中回访我的ScrollView
因为我可以调用方法[ScrollView setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated]所以我的ScrollView会随着子视图(UIView2)靠近UIWindow的边缘而更新。
感谢您的建议。
答案 0 :(得分:3)
您描述的行为是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可能不会弄乱它们并且它可能对您更好
如果无法解决这个问题,有没有办法从UIView 2更新ScrollView,以便在靠近角落时滚动?
您是否尝试通过调用
来制作UIScrollView
滚动条
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated