我尝试构建具有 3 个 subview 的 Controller ,可以通过分段控件进行切换。问题是,我看到的是白屏,而不是 3 个 Controller 中的 2 个的内容。
代码如下
@IBAction func segmentedControllSelected(sender: UISegmentedControl) {
switch sender.selectedSegmentIndex
{
case 0:
self.parentView.addSubview(subViewOne!)
subViewOne?.frame = subViewOne!.superview!.bounds
subViewOne?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
subViewTwo?.removeFromSuperview()
subViewThree?.removeFromSuperview()
case 1:
self.parentView.addSubview(subViewTwo!)
subViewTwo?.frame = subViewTwo!.superview!.bounds
subViewTwo?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
subViewOne?.removeFromSuperview()
subViewThree?.removeFromSuperview()
case 2:
self.parentView.addSubview(subViewThree!)
subViewThree?.frame = subViewThree!.superview!.bounds
subViewThree?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
print("parentView frame is \(parentView.frame.height)")
print("scrollView contentSize is \(scrollView.contentSize.height)")
print("subViewThree frame is \(subViewThree?.frame.height)")
subViewThree?.frame.size.height = 2000
print("subViewThree frame is \(subViewThree?.frame.height)")
subViewOne?.removeFromSuperview()
subViewTwo?.removeFromSuperview()
default:
break;
}
}
override func viewDidLoad() {
super.viewDidLoad()
segmentedControllPositionY = segmentedControll.frame.origin.y
scrollView.delegate = self
gameInfoMainViewController = UIStoryboard(name: "GameInfo", bundle: nil).instantiateViewControllerWithIdentifier("GameInfoMainViewController") as? GameInfoMainViewController
gameInfoMembersViewController = UIStoryboard(name: "GameInfo", bundle: nil).instantiateViewControllerWithIdentifier("GameInfoMembersViewController") as? GameInfoMembersViewController
gameInfoTeamsViewController = UIStoryboard(name: "GameInfo", bundle: nil).instantiateViewControllerWithIdentifier("GameInfoTeamsViewController") as? GameInfoTeamsViewController
gameInfoTeamsViewController!.delegate = self
self.addChildViewController(gameInfoMainViewController!)
self.addChildViewController(gameInfoMembersViewController!)
self.addChildViewController(gameInfoTeamsViewController!)
subViewOne = gameInfoMainViewController!.view
subViewTwo = gameInfoMembersViewController!.view
subViewThree = gameInfoTeamsViewController!.view
}
override func viewWillAppear(animated: Bool) {
self.parentView.addSubview(subViewOne!)
subViewOne!.frame = subViewOne!.superview!.bounds
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.y > segmentedControllPositionY! - 40 {
segmentedControllTopConstraint.constant = scrollView.contentOffset.y + 40
} else {
segmentedControllTopConstraint.constant = segmentedControllPositionY!
}
}
func passHeight(height:CGFloat) { // delegate method which is called in controller with tableview and passes height of tableview
tableViewHeight = height
parentView.frame.size.height = tableViewHeight!
parentView.layoutIfNeeded()
scrollView.contentSize.height = tableViewHeight! + segmentedControll!.frame.height + headerView.frame.size.height
}
这是 subview Controller 的样子
这是它在模拟器中的样子(白屏,无标签)
如果我删除
subViewTwo?.frame = subViewTwo!.superview!.bounds
subViewTwo?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
我最终得到了这个
最佳答案
希望这提供一些帮助,我认为使用容器 View 并用可切换 View 填充它更容易,这将通过设置 activeViewController 来完成,它将删除非事件 View 并显示填充容器 View 框架的其他 View
gameInfoMainViewController = UIStoryboard(name: "GameInfo", bundle: nil).instantiateViewControllerWithIdentifier("GameInfoMainViewController") as? GameInfoMainViewController
gameInfoMembersViewController = UIStoryboard(name: "GameInfo", bundle: nil).instantiateViewControllerWithIdentifier("GameInfoMembersViewController") as? GameInfoMembersViewController
gameInfoTeamsViewController = UIStoryboard(name: "GameInfo", bundle: nil).instantiateViewControllerWithIdentifier("GameInfoTeamsViewController") as? GameInfoTeamsViewController
gameInfoTeamsViewController!.delegate = self
// to be called in view didAppear
activeViewController = gameInfoMainViewController
private var activeViewController: UIViewController? {
didSet {
removeInactiveViewController(oldValue)
updateActiveViewController()
}
}
private func removeInactiveViewController(inactiveViewController: UIViewController?) {
if let inActiveVC = inactiveViewController {
inActiveVC.willMoveToParentViewController(nil)
inActiveVC.view.removeFromSuperview()
inActiveVC.removeFromParentViewController()
}
}
private func updateActiveViewController() {
if let activeVC = activeViewController {
addChildViewController(activeVC)
activeVC.automaticallyAdjustsScrollViewInsets = true
activeVC.view.autoresizingMask = [ UIViewAutoresizing.FlexibleHeight , UIViewAutoresizing.FlexibleWidth]
activeVC.view.frame = contentView.bounds
contentView.addSubview(activeVC.view)
// contentView is the containerView
activeVC.didMoveToParentViewController(self)
}
}
关于ios - subview 不出现在父 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240723/