菜鸟教程小白 发表于 2022-12-13 16:19:09

objective-c - ViewController 只调用一次 touchesMoved


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

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

<p>我的问题是,当我移动说 UIView 2 on touch 时,为什么 ViewController 只调用一次“touchesMoved”?</p>

<p>现在 UIView 有它自己的 touchesMoved 方法,但我需要调用 Controller 的 touchesMoved,因为我需要它与 ScrollView 对话以更新其位置。比如当那个 UIView 2 靠近拐角的时候,让 ScrollView 稍微移动一下就可以完全显示 UIView 2。</p>

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

<p>编辑:</p>

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

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

<p>因为我可以调用方法 所以当 subview(UIView2) 靠近 UIWindow 的边缘时,我的 ScrollView 会得到更新。 </p>

<p>感谢您的建议。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您描述的行为是 <code>UIScrollView</code> 劫持触摸移动事件的结果。换句话说,一旦 <code>UIScrollView</code> 检测到触摸移动事件落在其框架内,它就会控制它。我在尝试创建一个特殊的滑动处理程序时遇到了同样的行为,每次 <code>UIScrollView</code> 也对滑动感兴趣时它都会失败。</p>

<p>在我的例子中,我通过拦截 <code>sendEvent:</code> 中的事件解决了这个问题,该事件在我的自定义 <code>UIWindow</code> 中被覆盖,但我不知道你是否想这样做相同的。无论如何,这对我有用:</p>

<pre><code>- (void)sendEvent:(UIEvent*)event {
NSSet* allTouches = ;
UITouch* touch = ;
UIView* touchView = ;

//-- 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 &amp;&amp; _initialView &amp;&amp; touch.phase != UITouchPhaseBegan)
    touchView = _initialView;

    //-- do your own management of the event

    //-- let the event propagate if you want also the default event management
;

}
</code></pre>

<p>您可能会研究的另一种方法是将 <em>手势识别器</em> 附加到您的 View- 它们具有相当高的优先级,因此 UIScrollView 可能不会干扰它们,它可能对您更有效.</p>

<blockquote>
<p>If there is no way around this is there a way to update ScrollView from UIView 2 to scroll when its near a corner?</p>
</blockquote>

<p>您是否尝试通过调用使 <code>UIScrollView</code> 滚动:</p>

<pre><code>- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - ViewController 只调用一次 touchesMoved,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12427733/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12427733/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - ViewController 只调用一次 touchesMoved