【问题标题】:Remove subview from UIScrollView and updating view从 UIScrollView 中删除子视图并更新视图
【发布时间】:2016-06-09 00:03:57
【问题描述】:

我正在尝试检查传递给 ViewController 的字典是否具有指向图像的链接。 如果有链接,我想显示图片,使用 AlamofireImage

如果没有,那么只需从 scrollView 中删除 UIImageView,这样图像下方的其他项目就会粘在屏幕顶部。

设置如下:

UIScrollView

-> UIView

--> UIImageView

--> UILabel(标题的一些短文本)

--> UILabel(一些使视图可滚动的内容的长文本)


我已经通过 Interface Builder 和 Auto Layout 设置了我的视图,如下所示:

UIImageView:上、左、右、下约束,高宽比为 1:1 没有特定的高度/宽度

UILabel:top(需要优先级)图片,top(高优先级)top-layout-guide,右、左、下约束

第二个UILabel:上、左、右、下约束


ViewDidLoad 内部

if let imageURLString = item["imageLink"] as? String {
    let imageURL = NSURL(string: imageURLString)!
    image.af_setImageWithURL(imageURL, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(2), runImageTransitionIfCached: true, completion: nil)
}
else {
    self.image.removeFromSuperview()
    self.scrollView.setNeedsLayout()
}

使用此代码,当有链接时,它会加载图像并且一切都显示良好,而不会弄乱滚动视图。但是从 scrollView 中删除它会阻止 scrollView 能够滚动。即使滚动条指示器出现并且视图“尝试”滚动,但一切都被冻结了!

【问题讨论】:

    标签: ios swift uiscrollview autolayout


    【解决方案1】:

    您的UIScrollView 被“冻结”,因为它的内容视图不再比滚动视图本身大。这是因为当您从滚动视图中取出视图时,您需要添加新的约束,以便 Auto-Layout 可以重新计算内容视图的大小。

    【讨论】:

      【解决方案2】:

      在自动布局环境中,以编程方式添加或删除视图是不好的,如果有必要,您必须注意各自的约束。在您的情况下,出了问题的是,您已将第一个标签的顶部空间设置为其上方的 imageView,并且根据要求完全删除了 viewDidLoad 中的该 imageView,这不是处理自动布局的正确方法。

      我可以建议您不要从其 superView 中删除您的 imageView,而只需将高度约束设置为 imageView 并将其初始高度约束常量设置为 0,因此您现在将无法看到 imageView。只需更新约束并创建高度约束的出口并更改代码如下 -

      if let imageURLString = item["imageLink"] as? String {
        let imageURL = NSURL(string: imageURLString)!
        image.af_setImageWithURL(imageURL, placeholderImage: nil, filter:  nil, imageTransition: .CrossDissolve(2), runImageTransitionIfCached:  true, completion: nil)
        imageViewHeightConstraint.constant = <heightYouWantToSet>
        self.view.setLayoutIfNeeded()
      } else {
        imageViewHeightConstraint.constant = 0 //Hide imageView by setting its height to 0
        self.view.setLayoutIfNeeded()
      }
      

      您可能还需要将 imageView 高度约束的优先级更改为 Low 以防止打破约束

      【讨论】:

      • 您的答案有效。即使没有图像,将初始高度约束设置为低优先级的 0 也可以完成这项工作。我尝试在设置图像之前和之后打印 ScrollView 和 UIImageView 的 contentSize 和约束。对我来说有趣的是,如果你不在你的 ImageView 中放置一个图像,你的 ImageView 和 ScrollView 就不会有 contentSize 的任何限制。你知道为什么会这样吗,即使我的 ImageView 的纵横比是 1:1?
      • 这一切都归功于内在内容大小。就像 UILabel 和 UIButton 根据其内容调整自身大小一样,UIImageView 也根据其要保存的图像大小调整自身大小。内在内容大小对于标签和按钮非常有用,但对于 UIImageView 来说不是很好。因为您要设置到 UIImageView 的图像实际上可能大于屏幕尺寸,我们不希望我们的图像视图与图像本身一样大。
      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多