相关疑难解决方法(0)

如何从UIScrollView窃取触摸?

今天,在我的创作时间,我做了一些非常全面的研究,如何从UIScrollView窃取触摸并立即将它们发送到特定的子视图,同时保持其余滚动视图的默认行为.考虑在UITableView中使用UIPickerView.默认行为是,如果您将手指拖到选择器视图上,滚动视图将滚动,选择器视图将保持不变.

我尝试的第一件事是覆盖

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
Run Code Online (Sandbox Code Playgroud)

并且根本不允许UIScrollView取消选择器视图内的触摸.这有效,但它有一个令人不快的副作用.您希望选择器视图立即响应,因此您必须设置delaysContentTouches为NO.问题是您不希望表视图的其余部分立即响应,因为如果确实如此,表视图单元将始终在滚动开始之前突出显示几毫秒.

我尝试的第二件事是覆盖

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)

因为我已经读过滚动视图总是返回自己,所以它会"窃取"其子视图中的触摸,然后如果它们对滚动视图不感兴趣则将它们发送到子视图.但是,这不再适用.UIScrollView的hitTest的默认实现:withEvent:实际上返回应该接收触摸的子视图.相反,它使用手势识别器来拦截触摸.

所以我尝试的第三件事就是实现我自己的手势识别器,如果触摸在选择器视图之外,则会导致失败,否则会成功.然后我将所有滚动视图的手势识别器设置为失败,除非我的手势识别器使用以下代码失败:

for (UIGestureRecognizer * gestureRecognizer in self.tableView.gestureRecognizers)
{
    [gestureRecognizer requireGestureRecognizerToFail:myRecognizer];
}
Run Code Online (Sandbox Code Playgroud)

事实上这实际上是从滚动视图中窃取了触摸,但是拾取器视图从未接收到它们.所以我可能只是发送我的手势识别器使用此代码接收的所有触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch *touch in touches)
        [touch.view touchesBegan:touches withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)

以上代码是简化版.我还确保视图是一个选择器视图(或其中一个子视图),并为上面提到的手势识别器设置适当的状态.我也做了同样的取消,结束和感动.但是,选择器视图仍然没有响应.

在回到我的日常工作之前,我还尝试了最后一件事.在我广泛的谷歌搜索过程中,我读到嵌套的UIScrollViews从3.x开始就神奇地工作了,所以我尝试将我的选择器视图放在嵌套的UIScrollView中并在其上设置以下属性:

scrollView.delaysContentTouches = NO;
scrollView.canCancelContentTouches = NO;
Run Code Online (Sandbox Code Playgroud)

正如人们所期望的那样,外部滚动视图不会处理内部滚动视图与处理选择器视图时的任何不同,因此内部滚动视图没有接收到触摸.我认为这是一个很长的镜头,但它很容易实现,所以我认为值得一试.

我所知道的是UIScrollView有一个名为UIScrollViewDelayedTouchesBeganGestureRecognizer截取触摸的手势识别器,并在150(?)ms之后将它们发送到适当的子视图.我想我应该能够写一个类似的识别器,导致滚动视图的默认识别器失败,而不是延迟触摸立即将它们发送到选择器视图.因此,如果有人知道如何编写这样的识别器,请告诉我,如果您有任何其他问题的解决方案,那么您也非常欢迎.

感谢您阅读整个问题,即使您不知道答案,您仍然可以提出问题,以便得到更多关注(希望能得到答案的人).谢谢!:)

iphone nested uiscrollview uipickerview ios4

38
推荐指数
1
解决办法
2万
查看次数

UIButton在UIScrollView中不起作用

我的观点结构:

UITableView
  UITableViewCell
    UIScrollView
      CustomView
        UIButton
Run Code Online (Sandbox Code Playgroud)

问题是当我触摸它时UIButton不起作用.我用代码创建它:

btn = [[UIButton alloc] init];
[btn setImage:image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tileTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
btn.layer.zPosition = 1;
[self addSubview:btn];
Run Code Online (Sandbox Code Playgroud)

我还添加了这个:

scroll.delaysContentTouches = NO;
scroll.canCancelContentTouches = NO;
Run Code Online (Sandbox Code Playgroud)

但我的按钮无论如何都不起作用.我无法取消内容或为UITableView设置延迟,因为如果我设置它,UITableView会停止滚动垂直.

谢谢你的帮助!

uibutton uiscrollview ios

19
推荐指数
1
解决办法
3万
查看次数

如何取消UIScrollView中的滚动

我使用UIScrollView在iPhone上制作大尺寸(大于320像素)的UI.

我创建了一个UIScrollView实例,并在其上添加了一些子视图.问题是我只想在用户触摸子视图之外时启用滚动,当用户触摸其中一个子视图时停止滚动.

我阅读文件并试图找到样品,但我找不到好的提示.如果您有任何想法,请帮助我.

iphone cocoa-touch uiscrollview

16
推荐指数
4
解决办法
3万
查看次数

UIScrollView如何从其子视图中窃取?

我希望能够在他们的子视图之前创建我自己的UIView容器子类,它可以首先对触摸作出反应.这很棘手,因为通常子视图会touchesBegan:在超级视图之前接收触摸事件(通过等).UIScrollView如何反转这个?

要清楚,我不是问UIScrollView的行为方式.我理解它的作用,以及你通常如何使用它.我问的是如何干净地实现我自己的版本 - 不是因为我想,而是因为我正在尝试构建可重用的容器视图,利用类似的行为.

iphone cocoa-touch uiscrollview

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

uiscrollview ×4

iphone ×3

cocoa-touch ×2

ios ×1

ios4 ×1

nested ×1

uibutton ×1

uipickerview ×1