我在UIScrollView后面有一个UIButton。滚动的背景是透明的,按钮位于右下角。所以它是可见的。
问题是当UIButton低于滚动时,它不响应任何触摸事件。在这种情况下,它需要什么来响应触摸事件?
谢谢
答案 0 :(得分:4)
您应该使用+ touchesBegan方法将触摸传递给下一个对象。
以下是如何执行此操作的示例:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
printf("MyButton touch Began\n");
[self.nextResponder touchesBegan:touches withEvent:event];
}
关于响应者链的更多信息:
答案 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上做过,与传递事件有关。在线搜索你应该能找到一些指示。我记得我花了一段时间才解决它。