【问题标题】:ViewController calling touchesMoved only onceViewController 只调用一次 touchesMoved
【发布时间】:2012-09-14 15:37:10
【问题描述】:

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

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 方法,但我需要调用控制器的 touchesMoved,因为我需要它与 ScrollView 对话以更新其位置。比如当那个 UIView 2 靠近拐角的时候,让 ScrollView 稍微移动一下就可以完全显示 UIView 2。

如果没有办法解决这个问题,有没有办法从 UIView 2 更新 ScrollView 以在靠近角落时滚动?

编辑:

我想我可能已经找到了解决办法。不确定这是否会被 Apple 接受,但是:

我刚刚调用了一个实例变量,即 = self.superview,然后我可以在 UIView 的 touchesMoved 中与我的 ScrollView 对话

因为我可以调用方法 [ScrollView setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated] 所以当子视图 (UIView2) 靠近 UIWindow 的边缘时,我的 ScrollView 会得到更新。

感谢您的建议。

【问题讨论】:

  • 如果您担心将self.superview 转换为UIScrollView 并发送setContentOffset: 消息,这是完全合法的。
  • 太棒了!谢谢。我担心这会引起问题。非常感谢塞尔吉奥的帮助。

标签: objective-c ios uiview uiviewcontroller viewcontroller


【解决方案1】:

您描述的行为是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

【讨论】:

  • 我应该在哪里添加 -(void)sendEvent?另外,是的,我确实尝试从我的 UIViewController 调用“setContentOffset”,但这并没有获得 UIView 2 的更新位置,因此它只在第一次触摸时滚动。然后,当我移动视图时,它不会滚动。所以我需要做的是在滚动视图中移动 UIView 2 && 如果 UIView 2 靠近 ViewController 的边缘,则移动滚动视图
  • sendEvent... 你应该定义你的自定义 UIWindow 类并在那里定义它;那么你应该使用这个窗口类型而不是默认的类型(例如,在 Interface Builder 中设置主窗口类类型,或者在 appDidFinishLoading 中以编程方式设置它,这取决于你是怎么做的)
  • 有关覆盖窗口类型的详细信息,另请参阅此帖子:stackoverflow.com/questions/7883886/…
  • 无论如何,我的建议是首先尝试使用手势识别器来处理您内部视图的移动......这会简单得多(它可能有效,也可能无效,但它很容易实现)。
  • 好吧,我移动 ScrollView 的子视图(UIView 1,2,...)没有问题,我的问题是让他们与 ScrollView 对话,告诉它滚动或让 ViewController 处理那个,但是当我尝试 UIViewControllers touchesMoved 只被调用一次,而 UIView2 touchesMoved 不断被调用时。我基本上需要知道如何在每次 UIView 2 移动(或 ScrollView 子视图)时与我的 ScrollView 对话以更新其位置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2016-08-18
  • 2013-01-09
相关资源
最近更新 更多