在 UIScrollView Swift3 中加载 UIViewController
Loading UIViewController inside an UIScrollView Swift3
我有 2 个 UIViewController
。
一个 UIViewController
有一个有很多按钮的视图并且是 +2000 点高。
另一个 UIViewController
有一个 UIScrollView
.
这是我的代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
scrollView.contentSize = CGSize(width: 375, height: 2884)
DispatchQueue.main.async {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let thumb_vc = storyboard.instantiateViewController(withIdentifier: "thumb") as! ThumbsViewController
//self.present(vc, animated: true, completion: nil)
self.addChildViewController(thumb_vc)
self.scrollView.addSubview(thumb_vc.view)
}
}
虽然缩略图 UIViewController
加载到 UIScrollView
,但大小不对,无法滚动。
感谢任何帮助
当您可以使用自动布局轻松地将 View 嵌入滚动视图时,为什么要为 ScrollView 提供静态高度。
你可以参考这个 link,
https://www.natashatherobot.com/ios-autolayout-scrollview/
您 运行 遇到了一个问题,即在 运行 时加载时会调整视图的大小。情侣选项...
// NOT USING constraints / auto-layout
func setupA() -> Void {
scrollView.contentSize = CGSize(width: 375, height: 2884)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let vc = storyboard.instantiateViewController(withIdentifier: "thumb") as? ThumbsViewController {
// add the child VC
self.addChildViewController(vc)
// don't let "thumbs" view auto-resize
vc.view.autoresizingMask = []
// set "thumbs" view frame size to scroll view content size
vc.view.frame = CGRect(origin: CGPoint.zero, size: scrollView.contentSize)
// add "thumbs" view to the scroll view
self.scrollView.addSubview(vc.view)
// finish child VC process
vc.didMove(toParentViewController: self)
}
}
// USING constraints / auto-layout, with hard-coded sizing
func setupB() -> Void {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let vc = storyboard.instantiateViewController(withIdentifier: "thumb") as? ThumbsViewController {
// add the child VC
self.addChildViewController(vc)
// add "thumbs" view to the scroll view
self.scrollView.addSubview(vc.view)
// disable auto-resizing mask
vc.view.translatesAutoresizingMaskIntoConstraints = false
// set constraints to both control the size of the "thumbs" view
// as well as the contentSize of the scroll view
// set width and height constraints for the "thumbs" view
vc.view.widthAnchor.constraint(equalToConstant: 375).isActive = true
vc.view.heightAnchor.constraint(equalToConstant: 2884).isActive = true
// set leading, top, trailing, and bottom constraints to the scroll view
vc.view.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
vc.view.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
vc.view.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
vc.view.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
// finish child VC process
vc.didMove(toParentViewController: self)
}
}
// USING constraints / auto-layout, with sizing controlled by constraints set in IB for the "thumbs" view
func setupC() -> Void {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let vc = storyboard.instantiateViewController(withIdentifier: "althumb") as? ALThumbsViewController {
// add the child VC
self.addChildViewController(vc)
// add "thumbs" view to the scroll view
self.scrollView.addSubview(vc.view)
// disable auto-resizing mask
vc.view.translatesAutoresizingMaskIntoConstraints = false
// the constraints set in Interface Builder for the elements in the "thumbs" view
// will control its size
// setting the "edge" constraints relative to the scroll view will control the contentSize
// set leading, top, trailing, and bottom constraints to the scroll view
vc.view.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
vc.view.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
vc.view.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
vc.view.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
// finish child VC process
vc.didMove(toParentViewController: self)
}
}
我推荐 setupC()
中的方法,它使用没有硬编码大小值的自动布局约束。更容易规划不同的设备尺寸(以及未来在其他视图/应用程序/作业/等中的使用)。
您还必须指定 child 的框架。此外,无需在 viewDidLoad
方法中将 UI 更改分派到主队列。并且在将视图添加为子视图后,您必须调用 child 视图控制器的 didMove(toParentViewController:)
方法。您可以阅读有关容器视图控制器及其 children here.
的更多信息
我有 2 个 UIViewController
。
一个 UIViewController
有一个有很多按钮的视图并且是 +2000 点高。
另一个 UIViewController
有一个 UIScrollView
.
这是我的代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
scrollView.contentSize = CGSize(width: 375, height: 2884)
DispatchQueue.main.async {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let thumb_vc = storyboard.instantiateViewController(withIdentifier: "thumb") as! ThumbsViewController
//self.present(vc, animated: true, completion: nil)
self.addChildViewController(thumb_vc)
self.scrollView.addSubview(thumb_vc.view)
}
}
虽然缩略图 UIViewController
加载到 UIScrollView
,但大小不对,无法滚动。
感谢任何帮助
当您可以使用自动布局轻松地将 View 嵌入滚动视图时,为什么要为 ScrollView 提供静态高度。 你可以参考这个 link, https://www.natashatherobot.com/ios-autolayout-scrollview/
您 运行 遇到了一个问题,即在 运行 时加载时会调整视图的大小。情侣选项...
// NOT USING constraints / auto-layout
func setupA() -> Void {
scrollView.contentSize = CGSize(width: 375, height: 2884)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let vc = storyboard.instantiateViewController(withIdentifier: "thumb") as? ThumbsViewController {
// add the child VC
self.addChildViewController(vc)
// don't let "thumbs" view auto-resize
vc.view.autoresizingMask = []
// set "thumbs" view frame size to scroll view content size
vc.view.frame = CGRect(origin: CGPoint.zero, size: scrollView.contentSize)
// add "thumbs" view to the scroll view
self.scrollView.addSubview(vc.view)
// finish child VC process
vc.didMove(toParentViewController: self)
}
}
// USING constraints / auto-layout, with hard-coded sizing
func setupB() -> Void {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let vc = storyboard.instantiateViewController(withIdentifier: "thumb") as? ThumbsViewController {
// add the child VC
self.addChildViewController(vc)
// add "thumbs" view to the scroll view
self.scrollView.addSubview(vc.view)
// disable auto-resizing mask
vc.view.translatesAutoresizingMaskIntoConstraints = false
// set constraints to both control the size of the "thumbs" view
// as well as the contentSize of the scroll view
// set width and height constraints for the "thumbs" view
vc.view.widthAnchor.constraint(equalToConstant: 375).isActive = true
vc.view.heightAnchor.constraint(equalToConstant: 2884).isActive = true
// set leading, top, trailing, and bottom constraints to the scroll view
vc.view.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
vc.view.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
vc.view.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
vc.view.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
// finish child VC process
vc.didMove(toParentViewController: self)
}
}
// USING constraints / auto-layout, with sizing controlled by constraints set in IB for the "thumbs" view
func setupC() -> Void {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let vc = storyboard.instantiateViewController(withIdentifier: "althumb") as? ALThumbsViewController {
// add the child VC
self.addChildViewController(vc)
// add "thumbs" view to the scroll view
self.scrollView.addSubview(vc.view)
// disable auto-resizing mask
vc.view.translatesAutoresizingMaskIntoConstraints = false
// the constraints set in Interface Builder for the elements in the "thumbs" view
// will control its size
// setting the "edge" constraints relative to the scroll view will control the contentSize
// set leading, top, trailing, and bottom constraints to the scroll view
vc.view.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
vc.view.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
vc.view.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
vc.view.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
// finish child VC process
vc.didMove(toParentViewController: self)
}
}
我推荐 setupC()
中的方法,它使用没有硬编码大小值的自动布局约束。更容易规划不同的设备尺寸(以及未来在其他视图/应用程序/作业/等中的使用)。
您还必须指定 child 的框架。此外,无需在 viewDidLoad
方法中将 UI 更改分派到主队列。并且在将视图添加为子视图后,您必须调用 child 视图控制器的 didMove(toParentViewController:)
方法。您可以阅读有关容器视图控制器及其 children here.