【发布时间】:2015-09-15 06:21:42
【问题描述】:
我已经实现了一个 UIScrollView 和 UIpageControl 来显示 3 个 UIViewControllers。 它工作得很好,但我想在第二个 UIViewController 上开始显示。
我还没找到我的错在哪里:
var pageControl:UIPageControl!
var scrollView:UIScrollView!
var viewtest1:UIViewController!
var viewtest2:UIViewController!
var viewtest3:UIViewController!
override func viewDidLoad() {
super.viewDidLoad()
// Initialization of UIScrollView
self.scrollView = UIScrollView()
self.scrollView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
self.scrollView.pagingEnabled = true
self.scrollView.scrollEnabled = true
self.scrollView.showsHorizontalScrollIndicator = false
self.scrollView.showsVerticalScrollIndicator = false
self.scrollView.delegate = self
// Initialisation of UIPageControl
self.pageControl = UIPageControl()
pageControl.currentPageIndicatorTintColor = UIColor(red:0.325, green:0.667, blue:0.922, alpha: 1)
pageControl.pageIndicatorTintColor = UIColor.whiteColor()
pageControl.backgroundColor = UIColor.clearColor()
// Add different view to the screen in the order from left to right
self.addChildViewController(self.viewtest1)
self.addChildViewController(self.viewtest2)
self.addChildViewController(self.viewtest3)
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(true)
for var i=0; i < self.childViewControllers.count; i++ {
self.loadScrollViewWithPage(i)
}
self.pageControl.currentPage = 0
self.page = 0
self.pageControl.numberOfPages = self.childViewControllers.count
var viewController:UIViewController = self.childViewControllers[self.pageControl.currentPage] as! UIViewController
if viewController.view.superview != nil {
viewController.viewWillAppear(true)
}
self.scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * CGFloat(self.childViewControllers.count), scrollView.frame.size.height)
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
// Load Controllers
var viewController:UIViewController = self.childViewControllers[self.pageControl.currentPage] as! UIViewController
if viewController.view.superview != nil {
viewController.viewDidAppear(true)
}
}
override func viewWillDisappear(animated: Bool) {
var viewController:UIViewController = self.childViewControllers[self.pageControl.currentPage] as! UIViewController
if viewController.view.superview != nil {
viewController.viewWillDisappear(true)
}
super.viewWillDisappear(true)
}
override func viewDidDisappear(animated: Bool) {
var viewController:UIViewController = self.childViewControllers[self.pageControl.currentPage] as! UIViewController
if viewController.view.superview != nil {
viewController.viewDidDisappear(true)
}
super.viewDidDisappear(true)
}
func loadScrollViewWithPage(page:Int){
if page < 0 || page >= self.childViewControllers.count {
return
}
let controller:UIViewController = self.childViewControllers[page] as! UIViewController
if (controller == false) {
return
}
// add the controller's view to the scroll view
if (controller.view.superview == nil) {
var frame:CGRect = self.scrollView.frame
frame.origin.x = frame.size.width * CGFloat(page)
frame.origin.y = 0
controller.view.frame = frame
self.scrollView.addSubview(controller.view)
}
}
func changePage(sender:AnyObject) -> () {
var senderControl:UIPageControl = sender as! UIPageControl
var page:Int = Int(senderControl.currentPage)
// update the scroll view to the appropriate page
var frame:CGRect = self.scrollView.frame
frame.origin.x = frame.size.width * CGFloat(page)
frame.origin.y = 0
var oldViewController:UIViewController = self.childViewControllers[self.page] as! UIViewController
var newViewController:UIViewController = self.childViewControllers[self.pageControl.currentPage] as! UIViewController
oldViewController.viewWillDisappear(true)
newViewController.viewWillAppear(true)
self.scrollView.scrollRectToVisible(frame, animated: true)
self.pageControlUsed = true
}
override func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
var oldViewController:UIViewController = self.childViewControllers[self.page] as! UIViewController
var newViewController:UIViewController = self.childViewControllers[self.pageControl.currentPage] as! UIViewController
oldViewController.viewWillDisappear(true)
newViewController.viewWillAppear(true)
self.page = self.pageControl.currentPage
}
override func scrollViewDidScroll(scrollView: UIScrollView) {
if (self.pageControlUsed == true /*|| _rotating*/) {
// do nothing - the scroll was initiated from the page control, not the user dragging
return
}
var pageWidth:CGFloat = self.scrollView.frame.size.width
var page:Int = Int(floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1)
if (self.pageControl.currentPage != page) {
var oldViewController:UIViewController = self.childViewControllers[self.pageControl.currentPage] as! UIViewController
var newViewController:UIViewController = self.childViewControllers[page] as! UIViewController
oldViewController.viewWillDisappear(true)
newViewController.viewWillDisappear(true)
self.pageControl.currentPage = page
oldViewController.viewDidDisappear(true)
newViewController.viewDidDisappear(true)
self.page = page;
}
}
override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
self.pageControlUsed = false
}
override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
self.pageControlUsed = false
}
感谢您的帮助
【问题讨论】:
-
不要挖掘你的代码,但我想知道你为什么要这样设置你的项目?似乎更简单的方法是使用故事板,使用 UIScrollViews 设置三个 ViewControllers,然后使用 segues 从视图更改为视图。您还可以轻松地将初始视图控制器设置为您想要的任何视图
-
您的问题解决了吗?如果不让我知道你在哪里卡住了,我会尽力帮助你。
-
抱歉耽搁了。这里的 sn-p 是我的代码的简化版本,但它完全是这样设置的。我这样做是因为 uiscrollview 集成在 uitableviewcontroller 的头部。我在想以编程方式做会比使用故事板更容易。我在 viewwillappear 中成功使用了这条线: self.scrollView.contentOffset = CGPointMake(scrollView.frame.size.width * 1, 0);但我会喜欢你的解决方案!谢谢
-
很高兴我能提供帮助,如果我的回答有帮助,请标记为已接受。谢谢你。如果您需要任何帮助,请告诉我。
标签: ios swift uiviewcontroller uiscrollview uipagecontrol