ViewController只调用touchesMoved一次

时间:2012-09-14 15:37:10

标签: objective-c ios uiview uiviewcontroller viewcontroller

我有一个问题,我已经搜索过,但无法找到一个明确的答案。这是我的布局:

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的边缘而更新。

感谢您的建议。

1 个答案:

答案 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