Как я могу создать повторно используемые контроллеры представления внутри UIScrollView? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать горизонтальную прокрутку на всю страницу размером 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)
        ])
} 

Есть ли хороший способ создать какую-то функциональность повторного использования, с которой я играл на основе Этот ответ , хотя я понимаю, что это в первую очередь для UIPageViewControllers, где распределение и освобождение UIViewController ' s обрабатывается для вас.

Возможности повторного использования

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...