【问题标题】:Cannot set contentSize of an UIScrollView created via loadView无法设置通过 loadView 创建的 UIScrollView 的 contentSize
【发布时间】:2014-09-12 18:21:31
【问题描述】:

我需要在loadView 函数之外设置UIScrollViewcontentSize

但是在尝试这样做时,我遇到了错误'UIView' does not have a member named 'contentSize'

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        var bigRect = view.bounds
        bigRect.size.width *= CGFloat(someInt)

        view.contentSize = bigRect // 'UIView' does not have a member named 'contentSize'
    }

    override func loadView() {
        view = UIScrollView(frame: UIScreen.mainScreen().bounds)
    }

}

谢谢!

注意事项:

  • 在控制台中,view 确实是UIScrollView 的一个实例,但发送它contentSize 给我同样的错误。
  • view 替换为self.view 并不能解决问题;这里没有局部变量干扰。

【问题讨论】:

  • “视图”是在代码中还是在 IB 中定义的?也许它被定义为 UIView...

标签: ios swift uiscrollview


【解决方案1】:

viewUIViewController 类型的 UIView 属性。所以你应该先在局部变量中配置滚动视图,然后将其设置为视图变量:

override func loadView() {
    var scrollView = UIScrollView(frame: UIScreen.mainScreen().bounds)
    scrollView.contentSize = <Whatever>
    view = scrollView
}

如果您打算稍后更改滚动视图,您应该考虑:

  • 为您的课程添加新属性(良好做法)
  • 或随时转换view 属性as UIScrollView(非常糟糕的做法)

例如:

class ViewController: UIViewController {
    var scrollView:UIScrollView!

    override func viewDidLoad() {
        var bigRect = view.bounds
        bigRect.size.width *= CGFloat(someInt)

        scrollView.contentSize = bigRect.size
    }

    override func loadView() {
        scrollView = UIScrollView(frame: UIScreen.mainScreen().bounds)
        view = scrollView
    }

}

【讨论】:

  • 太好了,谢谢!为什么将view 转换为UIScrollView 被认为是一种不好的做法?
  • @delba 我认为他的意思是每次使用视图变量时进行强制转换都是不好的做法,因为它是重复的代码 - 你可以只做一次并将其存储在一个变量中,以免重复自己,因此使其更好地练习。如果您每次只使用一次该变量,那么我认为您决定采用哪种方式并不重要。
  • UITableViewController 还声明了一个 tableView 属性(这是被转换为 UITableView 的视图)所以我现在认为这个解决方案提供了一个很好的“对称性”
  • 是的,主要原因是您需要view 属性才能将其用作屏幕的视图(阅读UIViewController)。 scrollView 属性将直接与滚动视图相关。即使在这种情况下两者都是同一个实例,也有两个语义不同的东西。您可能(例如)希望在scrollView 上添加另一个UIView 作为view 以在页面上添加其他元素。你希望能够很容易地做到这一点。因为编写一个新属性不会花费您超过几秒钟的时间。值得。
  • 还有其他原因,例如代码可读性或安全性(在 Swift 上更是如此,所有内容都是强类型的,但这只是我的看法)。
【解决方案2】:

尝试将其重命名为 scrollView 而不是 view,因为 view 已经是一个附加到所有 UIViewControllers 的变量,所以它可能会混淆。当然,除非你想说你用故事板中的滚动视图替换了视图。在这种情况下,您需要将视图转换为滚动视图,如下所示:

(view as UIScrollView).contentSize

【讨论】:

  • 我赞成这个答案,因为从技术上讲,这是回答问题的最快方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多