【问题标题】:UIButton behind UIScrollViewUIScrollView 后面的 UIButton
【发布时间】:2011-11-11 17:57:45
【问题描述】:

我在 UIScrollView 后面有一个 UIButton。滚动条的背景是透明的,按钮位于右下角。所以它是可见的。

问题是 UIButton 在滚动下方时不响应任何触摸事件。在这种情况下,它需要什么来响应触摸事件?

谢谢

【问题讨论】:

  • 你为什么不把UIButton放在UIScrollView的顶部

标签: iphone ios cocoa-touch uiscrollview uibutton


【解决方案1】:

我今天遇到了这个问题,经过长时间的研究很难实现,因为您可能会失去拖动能力以换取按钮点击事件。

但是:我最终得到了一个 UIScrollView 子类,它接收一个或多个它有兴趣捕获事件的按钮。

关键是使用 [(UIControl*)view sendActionsForControlEvents: UIControlEventTouchUpInside];,因为调用 touchesBegan 方法并不总是按预期工作。这不会在您按下按钮时更改 GUI,但您可以根据需要在自定义方法中实现它。

@implementation ForwardScrollView

@synthesize responders = _responders;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _touchesEnabled = YES;
    }
    return self;
}


- (id)initWithCoder:(NSCoder *)aDecoder {
    if ( self = [super initWithCoder: aDecoder]) {
        _touchesEnabled = YES;
    }
    return self;
}


- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return _touchesEnabled;
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    _touchesEnabled = NO;
    UIWindow *window = [UIApplication sharedApplication].delegate.window;
    for(UITouch *touch in touches) {
        CGPoint point = [touch locationInView:self];
        point = [window convertPoint:point fromView:self];
        UIView *view = [window hitTest:point withEvent:event];

        UITouch* touch = [touches anyObject];
        UIGestureRecognizer* recognizer;
        if ([touch gestureRecognizers].count > 0) {
            recognizer = [touch gestureRecognizers][0];
        }

        if ( (!recognizer || ![recognizer isMemberOfClass:NSClassFromString(@"UIScrollViewPanGestureRecognizer")])  && [_responders containsObject: view]) {
            [(UIControl*)view sendActionsForControlEvents: UIControlEventTouchUpInside];
        }

    }
    _touchesEnabled = YES;

}

@end

对gestureRecognizers的计数是为了避免在没有真正点击时可能触发按钮的平移手势。

【讨论】:

    【解决方案2】:

    对于像我这样来寻求帮助的新手,您可以在 Storyboard 中执行以下操作:将按钮拖动到与 scrollView 相同的级别,并确保按钮位于 scrollView 下方 - 顺序很重要!位置越低,视图层越靠前

    【讨论】:

    • 问题是通过将按钮放在较低层来使其工作
    【解决方案3】:

    您应该使用 +touchesBegan 方法将触摸传递给下一个对象。
    下面是一个示例:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
    printf("MyButton touch Began\n");
    [self.nextResponder touchesBegan:touches withEvent:event]; 
    }
    

    以下是有关响应者链的更多信息:

    1. A Bit About the Responder Chain (http://iphonedevelopment.blogspot.com)

    2. Cocoa Application Competencies for iOS: Responder Object (http://developer.apple.com)

    【讨论】:

      【解决方案4】:

      实际上你可以做到这一点,我已经在 Mac 上做到了,与传递事件有关。网上搜索你应该能找到一些指点。我记得我花了一段时间才解决它。

      【讨论】:

      • 有史以来最差的答案。作者和评论者都不知道如何使用 SO?
      【解决方案5】:

      你可以试试这个。添加滚动视图后,您需要将按钮添加到子视图。

      ....

      [myView addSubview:myScrollView];

      .....

      [myView addSubview:myButton];

      如果您在 IB 中执行此操作,您只需将按钮拖到滚动视图下方...

      【讨论】:

        【解决方案6】:

        也许更好的方法是将 UIView 子类(而不是 UIButton)作为子视图放在 UIScrollView 上,并在其上添加 UITapGestureRecognizer。

        【讨论】:

        • 如果你让 UIView 成为 UIScrollView 的子视图,那么它将与滚动一起移动。我需要按钮/UIView 是静止的。
        • 好的,只试试 [parentViewOfButton bringViewToFront:uibutton];
        【解决方案7】:

        如果UIButtonUIScrollView 后面,则它无法响应触摸,因为有UIScrollView 挡住了!将UIButton 放在UIScrollView 上或缩小UIScrollView,使其不再挡住按钮。

        【讨论】:

        • 但是当滚动移动时,我需要按钮静止并在滚动后面
        • @vgr:好吧,你不能一边吃蛋糕一边吃。前视图挡住后视图。这就是它的工作原理。
        • 但它有完全透明的背景
        • @vgr,这没什么区别。
        • 正如其他人所解释的,这是可能的
        猜你喜欢
        • 2011-03-11
        • 2016-04-24
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        • 2012-01-17
        • 2013-01-20
        • 2013-02-02
        相关资源
        最近更新 更多