Swift:如何将UIScrollView的contentSize高度设置为内容高度?

6

我有一个UIScrollView。目前,我只是将其设置为屏幕高度的两倍(在这种情况下,框架只是UIScreen.mainScreen().bounds):

class VenueDetailView: UIScrollView {
  required init?(coder aDecoder: NSCoder) { fatalError("Storyboard makes me sad.") }

  override init(frame: CGRect) {
    super.init(frame: frame)
    contentSize = CGSize(width: frame.width, height: frame.height*2) <----------------

    backgroundColor = UIColor.greenColor()
  }


  func addBannerImage(imageUrl: NSURL) {
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.width, height: 300))

    // TODO: Make this asynchronous
    // Nice to have: cache the image
    if let data = NSData(contentsOfURL: imageUrl) {
      imageView.image = UIImage(data: data)
    }

    addSubview(imageView)
  }
}

然而,我希望它的大小与其内部所有内容的大小相同。我该怎么做?这是否意味着在添加所有子视图后我必须设置contentSize


滚动视图的问题在于,你不应该让滚动视图的大小等于内容大小!!!如果这样做,滚动视图将无法滚动!!!内容大小应该比滚动视图的大小大。 - Teja Nandamuri
我希望我的内容非常长,因此将内容大小设置为屏幕高度的2倍可以使其可滚动。但是,我希望内容大小与子视图的总高度相同。 - bigpotato
1个回答

9
这是否意味着我需要在添加所有子视图之后设置contentSize? 基本上是的。你的目标应该是让滚动视图变小,内容大小变大。这就是使滚动视图可滚动的原因:它的contentSize比其自身的bounds大小要大。因此,将滚动视图本身设置为与其父视图的bounds相同的frame,然后将其contentSize设置为包含所有子视图。

3
如何找到UIScrollView所有子视图的总高度? - bigpotato
所以你将高度存储为变量,每次添加子视图时都会递增它,最后将滚动视图的高度设置为该变量? - bigpotato
1
考虑最底部的视图。它有一个frame。这意味着它有一个origin.y(顶部)和一个size.height。两者之和是其底部的y值。但是,根据假设,它是最底部的视图。因此,这个总和,即最底部视图底部的y值,就是contentSize的高度(如果需要,可以添加一些底部填充)。 - matt
1
你可能想阅读我的书:http://www.apeth.com/iOSBook/ch20.html 在线版本是Objective-C,而不是Swift(当前版本是Swift),但你仍然可以理解其中的概念。 - matt
1
我只想说,这是我见过的关于UIScrollView关键参数最简洁的答案之一。 - AMC08
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接