将 UIScrollView 适配到 UIView

Posted

技术标签:

【中文标题】将 UIScrollView 适配到 UIView【英文标题】:Fitting a UIScrollView to a UIView 【发布时间】:2016-01-12 23:48:47 【问题描述】:

我正在尝试使用 UIScrollView 来显示一系列 UIView。在我的故事板中,我有一个视图控制器,其中包含一个使用 AutoLayout 进行约束的 UIView。

视图控制器(灰色的 UIView)

为了调用 UIScrollView,我使用了以下方法:

func initScrollview() 

    self.mainScrollView = UIScrollView(frame: self.mainView.bounds)
    self.mainScrollView!.contentSize = CGSizeMake((self.mainView.bounds.width)*CGFloat(3), self.mainView.frame.height)
    self.mainScrollView!.backgroundColor = UIColor.greenColor() // For visualization of the UIScrollView
    self.mainScrollView!.pagingEnabled = true
    self.mainScrollView!.maximumZoomScale = 1.0
    self.mainScrollView!.minimumZoomScale = 1.0
    self.mainScrollView!.bounces = false
    self.mainScrollView!.showsHorizontalScrollIndicator = true;
    self.mainScrollView!.showsVerticalScrollIndicator = false;
    self.mainScrollView!.delegate = self

    for i in 0...3 

        var tempView = SubView(frame: self.mainView.bounds)

        pages.insert(tempView, atIndex: i)
        self.mainScrollView!.addSubview(pages[i]);
    

    self.mainScrollView!.scrollRectToVisible(CGRectMake(mainScrollView!.frame.size.width, 0, mainScrollView!.frame.size.width, mainScrollView!.frame.size.height), animated: false)

当我运行我的代码时,UIScrollView 不适合 UIView。相反,它太短太宽。结果如下所示:

灰色的UIView,绿色的UIScrollView

我做错了什么导致 UIScrollView 的大小不正确?

【问题讨论】:

你把initScrollview放在哪里了? 我在 super.ViewDidLoad() 之后的 viewDidLoad() 中有 initScrollView。我刚刚注意到,如果我在 viewDidLoad() 中打印 mainView 的宽度,我得到 536.0,如果我在 viewDidAppear() 中打印宽度,我得到 311.0。这是预期的吗?这可能是我问题的根源吗? 是的。看看我的回答:) 【参考方案1】:

您应该将根据屏幕尺寸(UIViewControllerUIView)初始化 UI 元素尺寸的代码放在viewDidLayoutSubviews 中。因为在viewDidLoad,屏幕还没有调整大小,

【讨论】:

【参考方案2】:

在上面的代码中,没有提到将 mainScrollView 添加到 mainVew。

您要将 mainScrollView 添加到谁的视图?我的意见是你正试图将它添加到 self.view 而它应该是 self.mainView

在调用 initScrollView() 函数后尝试添加以下代码

self.mainView.addSubview(mainScrollView!)

【讨论】:

我添加了您的代码,它部分解决了我的问题。 mainScrollView 位置正确,但大小仍然不正确。我注意到的一件事是我在 viewDidLoad() 中调用了 initScrollView()。如果我在该函数中打印 mainView 的宽度,我得到 536.0,但如果我在 viewDidAppear() 中打印它,我得到 311.0。这可能是我的问题的根源吗?是否预计 mainView 在调用 viewDidAppear() 之前不会调整大小?【参考方案3】:

如果您将所有这些视图直接放在情节提要中而不是以编程方式放置,这可能会更容易。我在您的代码中看不到任何无法在 IB 中直观地完成的内容。此外,如果您在情节提要中启用了自动布局,则在代码中设置框架和大小将不起作用。 (自动布局将在下一次通过时更改您的值)

【讨论】:

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

将图像从 UIScrollView 移动到 UIView - Swift 4 PanGesture

将捏合手势从自定义 UIView 传递到父 UIScrollView

将 UIView 从 xib 添加到 UIScrollView

使用后将覆盖 UIView 的触摸事件转发到下面的 UIScrollView

将 UIView 控制器添加到 UIScrollview

将触摸事件从 UIVew 传输到 UIScrollView