在ios swift的垂直scrollview内部出现水平滚动视图问题

时间:2016-09-26 13:18:01

标签: ios swift uiscrollview swift2

我的布局目前是这样的:

查看
   - 查看
   - 垂直ScrollView
     ------查看
        ---------水平分页ScrollView
        ---------查看
           -------------水平ScrollView - 无法正常工作

有关xcode的视图层次结构截图,请参阅此图片:

enter image description here

使用 Swift

我正在动态添加子视图到这个"尺寸选择滚动视图"

两个问题:

  1. 添加视图后,子视图之间没有边距。每个子视图的协调。是这样的:(10.0,0.0,44.0,44.0),(54.0,0.0,44.0,44.0),(98.0,0.0,44.0,44.0),(142.0,0.0,44.0,44.0)等。
  2. 但是外观就是这样,每个子视图之间没有10分差距:http://i.stack.imgur.com/mCGRW.png

    1. 横向滚动是一种痛苦。它只适用于从滚动视图区域顶部1/4高度,并且很难滚动。如何布置子视图以使此滚动视图可以正确滚动?
    2. 注意:我明确将scrollview大小的内容大小设置为超出要求,以便我可以看到滚动。

2 个答案:

答案 0 :(得分:1)

我发现了这个问题。根据Apple Docs,触摸事件只有在完全位于其父级时才会传递给子视图。

在我的情况下,scrollview超出其父视图(Details View)的界限,因为触摸事件很奇怪。我增加了父视图的大小以适应scrollview,现在它工作正常。

来自文档(https://developer.apple.com/library/content/qa/qa2013/qa1812.html):

  

此问题的最常见原因是您的视图位于其父视图的边界之外。当您的应用程序收到触摸事件时,将启动命中测试过程以确定应该接收事件的视图。该过程从视图层次结构的根开始,通常是应用程序的窗口,并按前后顺序搜索子视图,直到找到触摸下的最前面的视图。该视图成为命中测试视图并接收触摸事件。此过程中涉及的每个视图首先测试事件位置是否在其范围内。只有在测试成功后,视图才会将事件传递给子视图以进行进一步的命中测试。因此,如果您的视图处于触摸状态但位于其父视图边界之外,则父视图将无法测试事件位置,也不会将触摸事件传递给您的视图。

答案 1 :(得分:1)

这始终是iOS的挑战。

不幸的是,有各种各样的解决方案,取决于具体情况

这是一个嵌入式解决方案,通常是正确的解决方案。

/*

So, PASS any touch to the NEXT view, BUT ALSO if any of OUR
subviews are buttons, etc, then THOSE should ALSO work normally. :/

*/

import UIKit

class Passthrough: UIView {

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {

        return subviews.contains(where: {
            !$0.isHidden
            && $0.isUserInteractionEnabled
            && $0.point(inside: self.convert(point, to: $0), with: event)
        })
    }

}

(当然,您也可以将呼叫插入某个类,例如

class SomeListOrWhatever: UICollectionView, .. {

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        print("MIGHT AS WELL TRY THIS")
        return subviews.contains(where: {
            !$0.isHidden
            && $0.isUserInteractionEnabled
            && $0.point(inside: self.convert(point, to: $0), with: event)
        })
    }

即使您“不完全了解问题所在”,这也是解决方案之一!

例如,这通常是@ kishorer747在doco中引用的确切问题的精确解决方案

这绝对是iOS中真正的麻烦。