在 Swift 中使用分页向 UIScrollview 添加子视图

Posted

技术标签:

【中文标题】在 Swift 中使用分页向 UIScrollview 添加子视图【英文标题】:Adding subviews to a UIScrollview with paging in Swift 【发布时间】:2015-03-01 18:11:43 【问题描述】:

我正在创建一个包含分页 UIScrollView 的 UIViewController,它应该添加从 StoryBoard 创建的视图。我引用的是 this article。基本上结构是

- MyController
  - UIScrollView
    - subview
    - subview
    - ... 

这就是我的故事板的样子:

左边是我的主控制器视图的一部分,它包含滚动视图。右边是我用来实例化单个页面的“freeForm”视图控制器。它们的大小相同。

这是我用于主控制器的代码:

import UIKit

class MainControllerVC: UIViewController 


    @IBOutlet var tagsScrollview: UIScrollView!
    var tagsPages:[UIViewController] = []
    var frame: CGRect = CGRectMake(0,0,0,0)

    override func viewDidLoad() 
        super.viewDidLoad()

        // generate tags view controller
        for index in 0..<5 

            frame.origin.x = self.tagsScrollview.frame.size.width * CGFloat(index)
            frame.size = self.tagsScrollview.frame.size
            tagsScrollview.pagingEnabled = true
            if let page:UIViewController = self.storyboard?.instantiateViewControllerWithIdentifier("tagsVC") as? UIViewController 

                var delta = 0.2 * CGFloat(index)
                page.view.frame = self.frame
                page.view.backgroundColor = UIColor(red: 0.2 + delta, green: 0.2 + delta, blue: 0.2 + delta, alpha: 1.0)
                self.tagsScrollview.addSubview(page.view)
                tagsPages.append(page)
            

        

        self.tagsScrollview.contentSize = CGSizeMake(self.tagsScrollview.frame.size.width * CGFloat(tagsPages.count), self.tagsScrollview.frame.size.height)


        // Do any additional setup after loading the view.
    

    override func viewWillAppear(animated: Bool) 

        super.viewWillAppear(animated)
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    



我正在创建几个具有不同颜色的虚拟页面和一个使用自动布局放置在中心的中心标签。

结果如下:

第一个(较暗的)页面子视图被正确添加,实际上视图的大小和标签的位置是我们所期望的。但是,第二个页面视图添加到了错误的 X 位置。这同样适用于下一个。 目前我在 iPhone 6 模拟器上运行示例,如果我在计算页面框架大小和滚动视图 contentSize 时向 self.tagsScrollview.frame.size.width 添加 89 个点,问题就解决了...... .but only for iPhone6!!!看起来滚动视图的大小不是我们所期望的,因为它不足以在其中创建等距页面。

我怀疑是自动布局问题,但不知道应该从哪里开始。

这件事快把我逼疯了。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

尝试在 viewDidLayoutSubviews 中创建您的页面。我发现 viewDidLoad 为时过早,您仍然有情节提要的帧大小 - 而不是最终的运行时大小。

我遇到了类似的页面滚动图像问题,这对我有用。

【讨论】:

以上是关于在 Swift 中使用分页向 UIScrollview 添加子视图的主要内容,如果未能解决你的问题,请参考以下文章

是否可以双向实现分页 UIScrollView?

iOS 嵌套 UIScrollViews 使用 AutoLayout

在 Swift 上将所有手势从 UIView 转换为 UIScrollView

如何在swift中使用alamofire和swiftyjson解析分页url?

如何在 swift 中使用自定义导航栏制作三个分页视图

Swift tableView 分页