我的布局目前是这样的:
查看
- 查看
- 垂直ScrollView
------查看
---------水平分页ScrollView
---------查看
-------------水平ScrollView - 无法正常工作
有关xcode的视图层次结构截图,请参阅此图片:
使用 Swift 。
我正在动态添加子视图到这个"尺寸选择滚动视图"
两个问题:
但是外观就是这样,每个子视图之间没有10分差距:http://i.stack.imgur.com/mCGRW.png
注意:我明确将scrollview大小的内容大小设置为超出要求,以便我可以看到滚动。
答案 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中真正的麻烦。