我试图通过点击按钮在滚动视图中放置不同高度的不同视图。我画了一个问题的图像:
如果单击按钮1(btn1),则加载视图1.如果单击按钮2,则加载视图2.
按钮上方和显示视图下方有小部件。因此,显示视图需要以某种方式具有动态高度,这不会影响scrollview中的其他元素。我尝试了container_views但是无法连接到不同高度的viewcontrollers。
更新:(这是另一个例子)
答案 0 :(得分:1)
这就是我解决这个问题的方法,views
中的UIScrollView
之一就是我所说的containerView
,我的containerView
位于我的ViewController
内{1}}例如。以下是我的层次结构在测试应用中的位置:
正如您所看到的,我在containerView
中有一个子视图且其高度已定义,橙色的BottomView
- 具有为containerView
定义的垂直间距约束。< / p>
当用户点击替换视图(我的示例中为replaceView(_)
方法)时,您只需先删除containerView
中的所有子视图,然后添加新视图,因为我们使用自动布局橙色视图将无论容器视图有多大/多小,都始终位于容器视图的下方......
@IBAction func replaceView(_ sender: UIButton) {
//remove all subviews from container view to be replaced
for subview in containerView.subviews {
subview.removeFromSuperview()
}
let greenView = UIView()
greenView.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(greenView)
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
greenView.topAnchor.constraint(equalTo: containerView.topAnchor),
greenView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
greenView.heightAnchor.constraint(equalToConstant: 50)
])
greenView.backgroundColor = .green
}
如果您有想要添加到另一个Storyboard View Controller的视图,可以像这样添加:
我假设您的Storyboard
被称为Main
,而我添加的视图控制器的故事板ID是GreenStoryboardID
@IBAction func replaceView(_ sender: UIButton) {
//remove all subviews from container view to be replaced
for subview in containerView.subviews {
subview.removeFromSuperview()
}
let storyboard = UIStoryboard(name: "Main", bundle:nil)
let greenViewController = storyboard.instantiateViewController(withIdentifier: "GreenStoryboardID")
guard let greenView = greenViewController.view else { fatalError() }
//add view properly so it is uses UIViewController contaniment methods
addChildViewController(greenViewController)
containerView.addSubview(greenView)
greenViewController.didMove(toParentViewController: self)
greenView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
greenView.topAnchor.constraint(equalTo: containerView.topAnchor),
greenView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
greenView.heightAnchor.constraint(equalToConstant: 50)
])
}
这取决于你如何正确调整视图控制器的大小,这里我只是将其高度设置为50,但你可以在UIViewController
子类中有一个方法,例如它有能力让你知道视图必须有多大才能将所有内容都放入容器视图中