【问题标题】:Objective c - Multiple scrollviews inside a scrollview目标 c - 滚动视图内的多个滚动视图
【发布时间】:2013-06-07 14:19:06
【问题描述】:

所以,我在一个填充整个 ViewController 的滚动视图中获得了 2 个滚动视图。

所以第一个 SV 滚动没有问题,设置了 2 个子 SV 的 contentSize。

不幸的是,我认为它必须与 Autolayout 相关...它打开,如果我将其关闭,1. SV 不会滚动,但子 SV。

知道怎么解决吗?

【问题讨论】:

  • 你的意思是说内部滚动视图不滚动?您是否将 touches 事件传递给下一个响应者?
  • 没错!如何将其传递给下一个响应者??

标签: ios objective-c xcode uiscrollview autolayout


【解决方案1】:

尝试在自定义 ScrollView 子类中覆盖 hitTest:withEvent:。下面的代码应该让内部 UIScollView 处理所有的触摸。

@interface MyCustomScrollView : UIScrollView
@end

@implementation MyCustomScrollView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView* handler = nil;
    if ([self pointInside:point withEvent:event]) {
        for (UIView* view in self.subviews) {
            if ([view isKindOfClass:[UIScrollView class]]) {
                CGPoint subPoint = [self convertPoint:point toView:view];
                handler = [view hitTest:subPoint withEvent:event];
                if (handler) {
                    break;
                }
            }
        }

        if (nil == handler) {
            handler = [super hitTest:point withEvent:event];
        }
    }
    return handler;
}
@end

注意:可滚动区域内的可滚动子区域会导致糟糕的用户体验。考虑调整内部滚动视图的大小以适应其内容。

【讨论】:

  • 关于实施的附加说明。根据文档,您应该在子视图上检查pointInside:withEvent:,然后再向它询问hitTest:withEvent:。但是这是错误的。系统始终只在视图上调用hitTest:withEvent:,并由视图检查其中是否有触摸点。
  • ty,我下班后试试看。。我也在考虑外包内部滚动视图。。我会考虑的。。我会尽快回答!
  • 我现在尝试了该代码..它没有解决:/我首先将其设置为子 SV,然后将其设置为外部 SV.. 什么都没有:S 将外包子 SV。但如果你得到另一个,就告诉
【解决方案2】:

通常滚动视图会吃掉所有的触摸事件。因此,滚动视图的子视图不会获得触摸事件。要在子视图中启用触摸事件,您可以将触摸事件从滚动视图传递给下一个响应者。

您可以通过覆盖滚动视图子类中的触摸方法来做到这一点。详细的例子说明见here

【讨论】:

  • 我一到家就会检查!
  • 对不起,但我真的不明白这个例子......它使用了一个建议我不明白的服装 VC..
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多