【问题标题】:pass scroll event from uibutton to uiscrollview将滚动事件从 uibutton 传递给 uiscrollview
【发布时间】:2011-04-13 15:02:16
【问题描述】:

我有水平的UIScrollView,它是从UIScrollView 扩展而来的,我水平添加了UIButtons。我只能滚动出按钮区域,但如果我想滚动任何按钮,则会触发 UIControlEventTouchUpInside 事件。我不想要这个。如果我点击我想触发UIControlEventTouchUpInside 动作,如果我滚动我想滚动。

那么我如何将滚动事件从UIButton 传递到UIScrollView

【问题讨论】:

  • 如果您创建了一个简单的代码示例来说明您正在做什么,这将有所帮助,因为在将 UIButton 添加到 UIScrollView 的简单情况下,即使您开始也可以拖动滚动视图位置按钮上的触摸事件。

标签: iphone scroll uiscrollview uibutton


【解决方案1】:

子类UIScrollView,在- touchesShouldCancelInContentView:方法中返回YES。

【讨论】:

  • 非常感谢! :]
【解决方案2】:

该功能已内置。当您将 UIControl 元素作为滚动视图的子视图并检测到触摸事件时,它最初会传递给 UIScrollView。如果在一两分钟后触摸事件中没有足够的移动,它就会传递给按钮。

【讨论】:

  • 我希望我的按钮浮动在滚动内容上方的固定位置,而不是像滚动视图的子视图那样随内容移动。但是我无法使用任何其他方法使触摸事件正常流动,因此我尝试了这种方法并将所有按钮分组到一个视图中,该视图是滚动视图的子视图。我通过将其 frame.origin.x 设置为在滚动内容时匹配滚动视图的 contentOffset.x 来将该视图保持在可见内容之上,这由 scrollViewDidScroll 委托方法检测到。这行得通!
【解决方案3】:

如果您将 NSButton 子类化并创建该类型的按钮并在子类中覆盖以下内容,您可以将事件传递回父视图,在您的情况下为滚动视图

以下内容将使按钮永远不会触发事件,而是由父视图处理:

- (void)touchesBegan: (NSSet *)touches withEvent:(UIEvent *)event {
    [self.nextResponder touchesBegan:touches withEvent:event];      
}

- (void)touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
    [self.nextResponder touchesMoved:touches withEvent:event];  
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event 
{
    [self.nextResponder touchesEnded:touches withEvent:event];  
}

如果您想让按钮处理其中一个事件,请改用

[super touchesEnded:touches withEvent:event];

【讨论】:

  • 我试过了,但没用。原因是 UIScrollView 不响应 touchesBegan、touchesMoved 和 touchesEnded 事件。我将 UIScrollView 子类化以确认它正在接收这些事件,但没有对它们做任何事情。作为传递触摸事件的替代方法,您可以计算 touchesMoved 中的位置变化并更改滚动视图的 contentOffset 属性,但这不会为您提供正常滚动行为的任何平滑移动或惯性。
【解决方案4】:

试试这个:

self.button.exclusiveTouch = YES

对我来说就像一个魅力!

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多