如何在UIScrollView上方添加一个静态的UIButton?

4
我希望实现一个相当简单的效果。一个scrollView和一个静态按钮在它上面。 到目前为止没有问题。不幸的是,如果我想通过按钮滚动视图,就会出现问题。因此,在按钮内部开始拖动将影响按钮而不是滚动视图。
有任何想法如何实现这个效果吗?
非常感谢!
我认为这种方法行不通,因为touchesBegan在UIScrollView中已经过时了...(这个信息是否正确?)
这不是解决方案 :-)
@implementation MySuperButton

+ (id)buttonWithFrame:(CGRect)frame {
    return [[[self alloc] initWithFrame:frame] autorelease];
}

- (id)initWithFrame:(CGRect)frame {
    if (self == [super initWithFrame:frame]) {
        NSLog(@"initWithFrame");
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    [self.nextResponder touchesBegan:touches withEvent:event];
    NSLog(@"[self nextResponder]: %@", [self nextResponder]);
}

@end

很遗憾,这还不起作用。我认为下一个响应者是我的UIView而不是我的UIScrollView。有什么想法吗?

如果我的视图控制器作为下一个响应者将触摸事件传递给滚动视图,仍然没有任何反应。


当你说“above”时,你是指垂直方向还是在顶部? - Ian1971
我是指在其上面。对于误解我感到抱歉。 - danielreiser
你需要指定你想要的行为。Eiko在4月4日问了你,而你从那时起一直在线留言,但仍然没有回答。 - Erik B
@rdesign 你解决了这个问题吗?大多数答案的作者没有正确理解你... - Dima Deplov
5个回答

12
将按钮添加到滚动视图的父视图中,而不是滚动视图本身,这样一切都应该正常工作。直接在按钮上触摸将会传递给按钮,而在背景(滚动视图)上的触摸将会传递给滚动视图。
由于按钮不是滚动视图的子视图,因此它不会随着背景移动(我想你指的是“静态”)。

1
这解决了您的问题还是我误读了您的问题?按下按钮时应该发生什么(是否滚动)? - Eiko
如果他不想让它滚动,+1 这是正确的,但也许他希望滚动。我不明白为什么他还没有指定他想要的行为。 - Erik B

1

我从未深入研究过触摸事件等方面,但我会尽力用我的基本理解来帮助你。

尝试将按钮的exclusiveTouch设置为NO。不确定,但也许将enableMultitouch设置为YES。

如果这样做不起作用,我建议尝试子类化UIButton,重写触摸事件并在调用[super touchEventX:]之前/之后将它们传递给[self nextResponder]?


谢谢你的帮助。对我来说,这听起来有点复杂,因为我从未大量使用过触摸事件 :-) 我会尝试一下。 - danielreiser
@resign 我建议你尝试使用touchesEnded和touchesMoved。另外,将exclusiveTouch设置为NO有没有改变什么? - Zaky German
@rdesign 请尝试 scrollView.delaysContentTouches = YES; scrollView.canCancelContentTouches = YES;这里有一个关于同样问题的问题: https://dev59.com/J3RB5IYBdhLWcg3wWGEH - Zaky German

1

有点难理解你想要实现什么。您是否希望滚动按钮?

因此,在按钮内部开始拖动会影响按钮,而不是滚动视图。

不清楚这是否是您想要的行为或您想要更改的行为。

如果是前者,则Eiko的答案是正确的;如果是后者,则应将按钮添加为滚动视图的子视图,并在每次调用scrollViewDidScroll:时更新其框架。我从未尝试过,但在理论上它可以工作。


0

将整个滚动视图向下移动您按钮的高度,并将其高度缩小相同的量。然后将您的按钮放置在滚动视图上方 - 这样它就不是滚动视图的子级。


感谢您的回答。不幸的是,我表述错误了。我指的是在它上面。所以按钮应该在滚动视图的顶部。滚动视图仍然应该识别按钮接收到的触摸。按钮只有在点按内才会触发。 - danielreiser
1
所以你想要一次点击来影响两个不同的对象?这听起来像是一个糟糕的界面设计...那么这个按钮的原因是什么? - Wex
我想制作一个菜单。就像有一瓶酒(按钮)。你可以滑动背景选择你想要在内部还是外部找到一个地方来喝它(明白我的意思吗?) - danielreiser

0
如果您在视图中添加一个简单的按钮,那么如果您点击该按钮,它将调用其操作。
同样的方式,
如果您在ScroolView中添加一个简单的按钮,那么如果您点击该按钮,它将调用其操作。
并且,如果您触摸scroolview的空白区域,则会调用UIScrollView的委托方法。
如果您把手指放在按钮上并拖动它,它显然会影响到scrollview。 scrollview将会被拖动100%。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接