如何在UIScrollView中创建可重用的视图控制器?

时间:2019-04-08 22:09:04

标签: ios swift uiviewcontroller uiscrollview reusability

我正在尝试创建一个水平滚动UIScrollView的整页。在每个页面上,我都添加相同的UIViewController类的实例。我想创建某种可重用的功能,以节省所需的内存和处理器使用量。下面是我创建的基本实现,虽然我不太确定,但还是想着可重用性如何工作。感谢您提供的任何帮助。

当前的UIScroll ViewController模型

   let scrollView:UIScrollView = {
   let scrollView = UIScrollView(frame: CGRect.zero)
    scrollView.isPagingEnabled = true
    scrollView.backgroundColor = UIColor.gray
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.showsVerticalScrollIndicator = false
    scrollView.showsHorizontalScrollIndicator = true
    return scrollView
}()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    scrollView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: self.view.bounds.size)
    self.view.addSubview(scrollView)
    scrollView.delegate = self
    scrollView.contentSize = CGSize(width: 3 * self.view.frame.width, height: self.view.frame.height)

    NSLayoutConstraint.activate([
        scrollView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0),
        scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0),
        scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0),
        scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0)
        ])

    let viewController1 = UIViewController()
    viewController1.view.backgroundColor = UIColor.red
    let viewController2 = UIViewController()
    viewController2.view.backgroundColor = UIColor.blue
    let viewController3 = UIViewController()
    viewController3.view.backgroundColor = UIColor.green

    self.addChild(viewController1)
    viewController1.view.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: self.view.bounds.size)
    scrollView.addSubview(viewController1.view)
  addViewControllerContraints(viewController: viewController1, index: 0)
    viewController1.didMove(toParent: self)

    self.addChild(viewController2)
    viewController2.view.frame = CGRect(origin: CGPoint(x: self.view.bounds.width, y: 0), size: self.view.bounds.size)
    scrollView.addSubview(viewController2.view)
    addViewControllerContraints(viewController: viewController2, index: 1)
    viewController2.didMove(toParent: self)

    self.addChild(viewController3)
    viewController3.view.frame = CGRect(origin: CGPoint(x: 2 * self.view.bounds.width, y: 0), size: self.view.bounds.size)
    scrollView.addSubview(viewController3.view)
    addViewControllerContraints(viewController: viewController3, index: 2)
    viewController3.didMove(toParent: self)

}

func addViewControllerContraints( viewController: UIViewController, index:Int){
    guard let view = viewController.view else{
        print("View found nil")
        return
    }
    view.translatesAutoresizingMaskIntoConstraints = false
    let offset:CGFloat = UIScreen.main.bounds.width * CGFloat(index)
    print("Offset: \(offset)")
    NSLayoutConstraint.activate([
        view.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0),
        view.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: offset),
        view.heightAnchor.constraint(equalToConstant: self.view.bounds.height),
        view.widthAnchor.constraint(equalToConstant: self.view.bounds.width)
        ])
} 

是否有一种创建某种类型的重用功能的好方法,这是我基于This Answer所使用的方法,尽管我意识到这主要是针对UIViewController的分配和释放的UIPageViewControllers。为您处理。

可能的重用功能

var reuseableViewControllers:[UIViewController] = [UIViewController]()

private func unusedViewController() -> UIViewController {
    let unusedViewControllers = reuseableViewControllers.filter { $0.parent == nil }
    if let someUnusedViewController = unusedViewControllers.first {
        return someUnusedViewController
    } else {
        let newViewController = UIViewController()
        reuseableViewControllers.append(newViewController)
        return newViewController
    }
}

0 个答案:

没有答案