ContainerView Inside ScrollView 不要在 Swift 3 中滚动

Posted

技术标签:

【中文标题】ContainerView Inside ScrollView 不要在 Swift 3 中滚动【英文标题】:ContainerView Inside ScrollView don't scroll in Swift 3 【发布时间】:2017-05-11 08:51:39 【问题描述】:

我在 GitHub 上有示例项目,您可以在 -> https://github.com/LetSwiftDev/ContainerViewInsideScroll/tree/master

我有两个视图控制器,一个是名为oneViewController 的普通视图控制器,第二个是twoViewController,里面有UIScrollView,当我点击OPEN TWO 按钮时,会转到twoViewController,里面有ContainerView 但是;

我的 twoViewController 有不同的高度大小,比如 1500,里面有滚动视图并且不滚动到底部?我没有看到中间标签和底部标签。

我该如何解决? 有什么想法吗?

下面还有我的centerViewController 代码。我用centerViewController控制过去的视图控制器

import UIKit

open class centerViewController: UIViewController 
    fileprivate weak var viewController : UIViewController!
    fileprivate var containerViewObjects = Dictionary<String,UIViewController>()

    open var currentViewController : UIViewController
        get 
            return self.viewController

        
    


    fileprivate var segueIdentifier : String!

    @IBInspectable internal var startUp : String!


    override open func viewDidLoad() 
        super.viewDidLoad()



    
    open override func viewDidAppear(_ animated: Bool) 
        if let identifier = startUp
            segueIdentifierReceivedFromParent(identifier)
        
    
    override open func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    func segueIdentifierReceivedFromParent(_ identifier: String)

        self.segueIdentifier = identifier
        self.performSegue(withIdentifier: self.segueIdentifier, sender: nil)

    




    override open func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == segueIdentifier

            if viewController != nil


                viewController.view.removeFromSuperview()
                viewController = nil

            
            if ((self.containerViewObjects[self.segueIdentifier] == nil))
                viewController = segue.destination
                self.containerViewObjects[self.segueIdentifier] = viewController

            else
                for (key, value) in self.containerViewObjects

                    if key == self.segueIdentifier

                        viewController = value


                    

                


            

            self.addChildViewController(viewController)
            viewController.view.frame = CGRect(x: 0,y: 0, width: self.view.frame.width,height: self.view.frame.height)
            self.view.addSubview(viewController.view)
            viewController.didMove(toParentViewController: self)


        

    



【问题讨论】:

这个 github 链接是你的演示? @JitendraModi 是的,那里的所有代码 @JitendraModi 如果您下载并单击打开两个按钮后单击运行,您会看到没有滚动,滚动视图到底部,我看不到 是的,我正在运行您的演示。我正在解决它。 @JitendraModi 祝你好运 ;) 【参考方案1】:

这是您的演示和解决方案。你可以在这里下载 https://www.dropbox.com/s/zvrjd0gp06xe5nw/ContainerViewInsideScroll-master%202.zip?dl=0

问题是你必须学习 Scrollview 的自动布局。

我只是为滚动视图的给定约束提供提示。

首先获取滚动视图并适应屏幕并给出如下约束

现在在滚动视图中取一个视图并适合滚动视图并给出类似的约束

仍然是它给出的约束错误。所以现在,给滚动视图等宽的视图

现在您可以随心所欲地进行控制,并像我们给予其他控制一样正常地给予约束。

希望你能理解。 享受编码。

【讨论】:

老兄,我用你的答案做了一切,但在我的项目中没有工作你能帮我吗? 你改变了其他东西? 是的,我改变了你项目中的约束 如果你想要视频,我会发给你。 ty 但是另一个例子我尝试工作但在我的项目中不起作用你在项目中改变了其他?或者有 Skype 吗?【参考方案2】:

原因是scrollView太长,隐藏在屏幕下方,contentSize配置不正确。

一个懒惰的解决方案是当 twoViewController 出现时在代码中正确设置它们。

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)

    let width = self.scrollView.frame.width
    scrollView.frame = CGRect(origin: scrollView.frame.origin,
                              size: CGSize(width: width, height: CGFloat(500)))
    // Make sure this height is longer than scrollView.
    scrollView.contentSize = CGSize(width: width, height: CGFloat(2000))
  

正确的解决方案(以及实现滚动视图的正确方法)是修复可滚动内容大小的模糊性(情节提要中的自动布局错误),就像 @Jitendra Modi 提到的那样。

【讨论】:

设置框架对我有帮助。谢谢。

以上是关于ContainerView Inside ScrollView 不要在 Swift 3 中滚动的主要内容,如果未能解决你的问题,请参考以下文章

具有多个嵌入 segues 的 ContainerView

xlpagertabstrip 无法连接 containerView

NSInvalidUnarchiveOperationException 与 ContainerView

在 ContainerView 中引用 UIViewController

为什么我的collectionview内容在我的containerView下面

在 ContainerView 中显示 ViewController