UIButton在UIScrollView后面

时间:2011-09-06 23:49:16

标签: iphone ios cocoa-touch uiscrollview uibutton

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

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

谢谢

7 个答案:

答案 0 :(得分:4)

您应该使用+ 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)

答案 1 :(得分:2)

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

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

关键是使用 [(UIControl *)视图sendActionsForControlEvents:UIControlEventTouchUpInside]; ,因为调用 touchesBegan 方法并不总是按预期工作。当您按下按钮时,这不会更改GUI,但您可以根据需要在自定义方法中实现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 :(得分:0)

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

答案 3 :(得分:-1)

对于像我这样寻求帮助的新手,这里是你如何在Storyboard中做到这一点:将按钮拖动到与scrollView相同的级别,并确保按钮低于scrollView - 顺序很重要!位置越低,视图层的顶部

答案 4 :(得分:-2)

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

  

...

     

[myView addSubview:myScrollView];

     

.....

     

[myView addSubview:myButton];

如果你在IB中这样做,你只需要在滚动视图下方拖动按钮...

答案 5 :(得分:-4)

如果UIButton位于UIScrollView后面,则无法响应触摸,因为路上有UIScrollView!将UIButton放在UIScrollView上或缩小UIScrollView,使其不再妨碍按钮。

答案 6 :(得分:-9)

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