检测UIScrollView外部的点击次数

时间:2011-10-21 11:48:02

标签: ios uiscrollview

我已经根据这种技术实现了分页滚动 (iOS develop. How to extend UIScrollView's scroll event responding area?)并且它的工作方式与预期一致。

我正在滚动的视图包含几个按钮,我希望不仅可以点击滚动视图中心/分页的视图,还可以点击左侧和右侧的视图。我找不到任何方法来解决这个问题,但我还不是真正的iOS-Jedi,希望你们其中一人是:)

My xib, with the UIScrollView at the center

因此,从屏幕上可以看出,UIScrollView大约是窗口宽度的三分之一,UIScrollView的内容大得多:大约1500px并且包含许多以编程方式添加的按钮。这个解决方案很酷,实际工作的部分是按钮: 1)被分页到scrollview 2)在滚动视图外部可见(因为滚动视图未选中“剪辑子视图”)3)在uiscrollview中可见时按钮是可点击的。

但是什么不起作用就是这样: - 当前在窗口外的按钮在点击它们时不会收到“他们的”点击,而是将事件转发到底层(窗口的白色部分)视图。

3 个答案:

答案 0 :(得分:15)

所以,

我终于设法解决了这个难题,解决方案分为两个 部分。正如你所记得的那样,问题是点击事件没有传到 UIScrollView外部(可见)的按钮。事实证明,点击是由底层视图捕获的,并且可以通过弯曲关于谁被击中的规则来操纵他们找到目标的方式,从而欺骗事件通过你想要的地方。不确定这是应该如何完成,但它解决了我的问题.. :)

1)第一个必须在底部视图中覆盖以下方法 这样它在适当时返回scrollview而不是它自己。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{
    UIView *view = [super hitTest:point withEvent:event];

    if (view == self) 
        return [self scrollView];

    return view;
}

2)scrollView必须覆盖两个方法,将点击移交给其包含的对象。

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
    {
       UIView *view = [super hitTest:point withEvent:event];
       // Always return us.
       return view ;    
     }

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // We want EVERYTHING!
    return YES;
}

非常感谢您的评论和愿意提供帮助。 我好

答案 1 :(得分:2)

受到@tommys提到的答案的启发,事实证明,通过覆盖UIView的hinTest方法并返回scrollView,您实际上可以将此UIView的滑动分离到scrollView。

         Cursor phones = cr.query(Phone.CONTENT_URI, null, null, null, Phone.DISPLAY_NAME + " ASC");
           while (phones.moveToNext())
            {
              String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
              String phoneNumberString = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
              Log.e(name, phoneNumberString);
              namelist.add(name);
              numberlist.add(phoneNumberString);
            }             //The problem in your code is you need to close this bracket, and call phones.close() after all the items are fetched.Your code calls phone.close() everytime
            phones.close();

所以这个UIView就像是scrollView的扩展滚动区域,这个想法就在这里。如果你在scrollView和窗口的相同大小上创建UIView掩码,那么在窗口内的任何位置滑动都会使scrollView滚动。

以下是示例ExtensionScrollArea

答案 2 :(得分:0)

这是我的版本:

  1. 在容器中点击测试

    - (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        if ( CGRectContainsPoint( self.frame, point ) && ! self.hidden ) // <-- *
        {
            if ( ! CGRectContainsPoint( scrollView.frame, point ) )
                return scrollView;
        }
        return [super hitTest:point withEvent:event];
    }
    
  2. (*)如果您正在移动或以其他方式隐藏您的视图,此标记的行很重要,例如,如果您有多个视图,每个视图都有自己的滚动视图。如果您没有此行,您可能会将所有触摸指向屏幕外滚动视图!

    1. 在scrollview中覆盖

      - (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
      {
          return YES;
      }
      
    2. (在容器的hitTest中,您可以在if语句中排除其他帧以获取默认行为):)