Tôi đã giải quyết cho trường hợp của mình trong một chút hack. Đối với mỗi ContentView
, tôi có một số UIImageView
trong một số UIScrollView
để thu phóng. Vấn đề của tôi là khi khởi động ứng dụng, nếu người dùng đã phóng to trước khi vuốt, chuyển sang trang tiếp theo trong khi phóng to sẽ không hoạt động tốt. Tôi sử dụng đoạn mã sau (Swift 1.2) để giải quyết vấn đề này. Như tôi đã nói, đó là một chút của một hack mặc dù.
var layoutsubs = false
override func viewDidLoad() {
super.viewDidLoad()
//Other code for implementing pageViewController omitted
//add pageViewController to main view
self.addChildViewController(pageViewController)
self.view.addSubview(pageViewController.view)
pageViewController.didMoveToParentViewController(self)
//Load to the viewController after the starting VC, then go back to the starting VC
var viewControllers = [afterVC]
pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)
viewControllers = [startingVC]
pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Reverse, animated: true, completion: nil)
}
override func viewWillLayoutSubviews() {
//Load the viewController before the starting VC then go back to the starting VC
//viewWillLayoutSubviews() is called multiple times, so do this only once
if !layoutsubs {
let startingVC = self.viewControllerAtIndex(imageIndex) as ContentViewController
let beforeVC = pageViewController(pageViewController, viewControllerBeforeViewController: startingVC) as! ContentViewController
var viewControllers = [beforeVC]
pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Reverse, animated: true, completion: nil)
viewControllers = [startingVC]
pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)
layoutsubs = true
}
}
Về cơ bản, tôi tải bộ điều khiển chế độ xem trước và sau bộ điều khiển chế độ xem khởi động. Tôi thực hiện việc này bằng cách đặt từng thiết bị vào VC để xem qua setViewControllers(_:direction:animated:completion:)
(see ref), sau đó quay lại trình điều khiển chế độ xem bắt đầu. Tại sao điều này lại có hai chức năng khác nhau? Vâng, nếu bạn đặt tất cả trong một, chỉ một trong hai bộ điều khiển xem bên cạnh VC bắt đầu sẽ tải. Điều này có thể được mong muốn đối với một số trường hợp, nhưng tôi cần cả ba VC (trước, bắt đầu và sau) để tải.
Tôi không chắc phương pháp này hoạt động tốt như thế nào nếu UIPageViewController
đã được tải. Ví dụ: nếu bạn cần tải trang 2 khỏi trang đang được xem, sau một vài lần vuốt. Nó có thể bỏ qua nếu bạn đặt nó trong willTransitionToViewControllers()
.
Nguồn
2015-07-30 09:27:23
Bạn có tìm thấy giải pháp cho việc này không? Tôi có cùng một vấn đề, nhận được lag đáng chú ý khi swiping để điều khiển xem tiếp theo. – mattsson
Sắp xếp, nhưng câu trả lời rất cụ thể cho việc triển khai của tôi. Như tôi đã làm việc với UIPageViewController rất nhiều kể từ khi đăng câu hỏi này, tôi đã tìm thấy nó là một chủ đề rất khó khăn. Về cơ bản, các vấn đề của tôi có liên quan nhiều hơn đến việc truy vấn DB cho đúng dữ liệu để hiển thị, điều này làm chậm mỗi trang xuống. Tôi đã có thể tối ưu hóa trang của mình bằng cách tính toán trước dữ liệu từ DB và vẽ chế độ xem của tôi bằng cách sử dụng Bố cục tự động thay vì làm rối tung khung hình - điều đó đã giúp ích rất nhiều. Thứ hai, tôi đã có rất nhiều hình ảnh để hiển thị, vì vậy tôi lưu trữ chúng trong một NSMutableArray trực tiếp trên bộ điều khiển xem "chính" (cha mẹ của swipe). – DiscDev
"Giải pháp" của tôi đã kết thúc được ... tiếp tục chờ đợi Apple để đi ra với điện thoại nhanh hơn .... hahaha. Trên iPhone 6/6s, không còn tụt hậu nữa.Tôi được tối ưu hóa một số cơ sở dữ liệu lấy mã để xảy ra một lần khi bộ điều khiển trang đầu tiên được tạo ra và đã giúp rất nhiều, nhưng những cải tiến tốc độ chính đến từ bộ vi xử lý nhanh hơn và RAM hơn, và giảm dần hỗ trợ cho iPhone 4/4s =) – DiscDev