我在滚动视图中添加了两个视图控制器,并在两个视图控制器上都有动画,但这些动画只应在显示vc时调用。相反,当第一个vc显示时,两个动画都被执行。
func setUpScrollView() {
for i in 0..<2 {
let vc = NewViewController()
self.addChildViewController(vc)
scrollView.addSubview(vc.view)
vc.didMove(toParentViewController: self)
var frame: CGRect = vc.view.frame
frame.origin.x = self.view.frame.width * CGFloat(i)
vc.view.frame = frame
self.scrollView.contentSize = CGSize(width: self.view.frame.width * CGFloat(2), height: self.view.frame.size.height)
}
}
NewViewController
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("calling animation") //this is called twice immediatley after for loop, but only shows one vc.
}
答案 0 :(得分:2)
UIScrollView
无法按照UITableView
的方式管理内容,因此无论您在滚动视图的内容区域中放置什么,都会立即触发viewDidAppear
它是否在可见区域。
要决定何时开始制作动画,您必须手动跟踪滚动视图的内容区域中实际可见的内容:
分配一个UIScrollViewDelegate
并在其scrollViewDidScroll()
中进行检查,每次调用scrollView时都会调用它。
您可以使用scrollView.contentOffset
和scrollView.bounds
以及您感兴趣的子视图的大小和坐标来确定可见性,然后在动画首次显示时触发动画。