UIScrollView 用于主 UIView 内的较小 UIView

Posted

技术标签:

【中文标题】UIScrollView 用于主 UIView 内的较小 UIView【英文标题】:UIScrollView for a smaller UIView inside main UIView 【发布时间】:2016-08-18 23:59:26 【问题描述】:

我无法让这个工作,最好地解释了我想用我的故事板的这个图像做什么。

主要目标是使该容器可滚动,其大小取决于通过代码添加到其中的视图控制器。

这是我的观点。

显然,我的约束让我很困惑,但不确定如何让它们按预期运行,我尝试将容器固定到滚动视图,然后将滚动视图固定到主视图。屏幕以我想要的方式显示,但它只是不滚动。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

从您的问题和屏幕截图中无法确定您实际设置了哪些约束。而且您的问题甚至没有特别清楚地说明您的约束是否正常运行(除了滚动视图不滚动,这可能与约束相关也可能不相关)。

首先,我们需要确保我们的约束正确连接。您要为其放置滚动视图的容器视图应具有四个约束。左右各一个,将其固定在这些边缘上。一个用于底部将其固定到工具栏,一个用于顶部将其固定到您的顶视图。它不再需要任何约束。现在,底部的工具栏和顶部的视图需要设置它们的约束,以便它们具有每个设备/方向的恒定高度,并且不关心容器视图的大小。如果您的约束设置正确,那么在界面构建器文件中调整此视图的大小应该会更改容器视图的大小。如果这没有发生,请回到绘图板上,因为有些地方不太对劲。

如果您确信您的约束设置正确,那么滚动视图本身还有一些其他可能会阻止滚动的事情。

首先,检查最明显的。滚动视图上的滚动启用属性是否设置为true?如果不是...当然它不会滚动。

可能发生的另一件事是您的内容视图不大于滚动视图。确保你已经为滚动视图的内容正确设置了自动布局,否则内容视图不会比滚动视图大,并且不会发生滚动。

【讨论】:

好吧,我只是在了解执行此类操作需要哪些约束的一般提示后,我照片中的那些可能是错误的,所以我没有看到展示它们的意义。所以滚动视图应该在容器内,而不是像我的照片中那样反过来?,好吧,我看看这是怎么回事,让你知道【参考方案2】:

所以对于任何想知道如何做到这一点的人来说,经过大量的反复试验,我终于想出了如何做到这一点。 基本上我所做的是从情节提要中删除容器视图,像往常一样在滚动视图上设置我的约束:

然后在代码中添加一个容器视图作为滚动视图的子视图:

var containerView : UIView!
var currentViewController: UIViewController

override func viewDidLoad() 
        super.viewDidLoad()

        self.containerView = UIView()
        self.scrollView.addSubview(self.containerView)

为了使用我的 UISegmentControl 在不同的视图控制器之间进行交换,并让滚动视图滚动内容,无论新视图控制器有多大,我在我的 UISegmentControl 函数中添加了以下代码

@IBAction func segControlValueChanged(sender: AnyObject) 
    if let vc = viewControllerForSelectedSegmentIndex(sender.selectedSegmentIndex) 
        self.currentViewController!.view.removeFromSuperview()
        self.currentViewController!.removeFromParentViewController()      
        displayCurrentTab(sender.selectedSegmentIndex)
    


func displayCurrentTab(tabIndex: Int)
    if let vc = viewControllerForSelectedSegmentIndex(tabIndex) 
        self.addChildViewController(vc)
        self.containerView.addSubview(vc.view)
        vc.didMoveToParentViewController(self)
        vc.view.frame.size = CGSize(width: self.view.frame.width, height: vc.view.frame.height) //had to add this because otherwise for some reason my new vc width would not increase or decrease to its parent view
        self.currentViewController = vc
        self.scrollView.contentSize = vc.view.frame.size
    


func viewControllerForSelectedSegmentIndex(index: Int) -> UIViewController 
    //instantiate and return your view controller here

其他一些注意事项:

我在情节提要中为我计划添加到容器中的所有视图控制器禁用了“从 NIB 调整视图大小”

【讨论】:

以上是关于UIScrollView 用于主 UIView 内的较小 UIView的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UIView 在滚动时会在 UIScrollView 内移动?

将 UIView 从 UIPopOverController 中的 UIScrollView 拖放到主 UIViewController?

在 UIScrollView/UIView 内设置 UITableViewCell 样式

在 ViewController 之外的 UIScrollView 内绘制/布置宽 UIView 的内容

如何在 UIScrollview 中重新排列和删除 UIView,例如在 iOS 主屏幕中重新排列的应用程序

UIScrollView 作为 UIView 的子视图不适用于自动布局