如何将视图控制器添加到滚动视图中,但仅在滚动视图显示该视图控制器时实例化该视图控制器?

4

我在滚动视图中添加了两个视图控制器,并在这两个视图控制器上设置了动画,但这些动画只应在显示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)
        }
    }

新建视图控制器

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated) 
         print("calling animation") //this is called twice immediatley after for loop, but only shows one vc. 
    }
1个回答

2
UIScrollView不像UITableView一样管理内容加载,因此无论您将什么放在滚动视图的内容区域中,它都会立即触发其viewDidAppear方法,无论它是否在可见区域内。
为了决定何时开始您的动画,您需要手动跟踪滚动视图内容区域中实际可见的内容:
分配一个UIScrollViewDelegate并在其scrollViewDidScroll()方法中进行检查,该方法在scrollView每次滚动时调用。
您可以使用scrollView.contentOffsetscrollView.bounds以及您感兴趣的子视图的大小和坐标来确定可见性,然后在其首次变得可见时触发您的动画。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接