在 Swift 中使用分页将子视图添加到 UIScrollview
Adding subviews to a UIScrollview with paging in Swift
我正在创建一个包含分页 UIScrollView 的 UIViewController,它应该添加从 StoryBoard.I 引用 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 个点问题已解决....但仅适用于 iPhone6!!! 看起来滚动视图的大小不是我们所期望的,因为它不足以在其中创建等距页面。
我怀疑是自动布局问题,但不确定应该从哪里开始。
这件事快把我逼疯了。非常感谢任何帮助。
尝试在 viewDidLayoutSubviews 中创建页面。我发现 viewDidLoad 太早了,你仍然有故事板框架大小——而不是最终的运行时大小。
我有一个类似的页面滚动图像问题,这对我有用。
我正在创建一个包含分页 UIScrollView 的 UIViewController,它应该添加从 StoryBoard.I 引用 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 个点问题已解决....但仅适用于 iPhone6!!! 看起来滚动视图的大小不是我们所期望的,因为它不足以在其中创建等距页面。
我怀疑是自动布局问题,但不确定应该从哪里开始。
这件事快把我逼疯了。非常感谢任何帮助。
尝试在 viewDidLayoutSubviews 中创建页面。我发现 viewDidLoad 太早了,你仍然有故事板框架大小——而不是最终的运行时大小。
我有一个类似的页面滚动图像问题,这对我有用。