ios - subview 不出现在父 View 中

标签 ios

我尝试构建具有 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 的样子

enter image description here

这是它在模拟器中的样子(白屏,无标签)

enter image description here

如果我删除

subViewTwo?.frame = subViewTwo!.superview!.bounds
subViewTwo?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

我最终得到了这个

enter image description here

最佳答案

希望这提供一些帮助,我认为使用容器 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)
            }
        }

这是要使用的 UI 当用户从分段 View 中选择一个项目时,您应该更改事件 View 以加载另一个 View enter image description here

关于ios - subview 不出现在父 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240723/

相关文章:

objective-c - Objective-C : Can I set a subview to be firstResponder?

iphone - UIBackgroundModes 和 UIAccelerometer

ios - 如何在 iOS、Swift 中更改底部布局约束

ios - 当我创建一个类并调用在该类中创建的方法时,我遇到错误,它在函数中重定向两次并显示 nil

ios - 多个简单UIView的内存管理

ios - Xcode 错误 - 由于未捕获的异常 'NSUnknownKeyException' 导致应用程序终止,原因 : '[ setValue:forUndefinedKey:]:

objective-c - 加载纹理时动画屏幕

ios - Xcode - 创建了一个 iOS 框架但不能在项目中使用它

ios - NSCalendarIdentifierRepublicOfChina vs NSCalendarIdentifierChinese?

ios - 无法使用点符号快速访问函数成员