【问题标题】:When should I initialise subview using iOS autolayout我什么时候应该使用 iOS 自动布局初始化子视图
【发布时间】:2015-12-01 13:14:15
【问题描述】:

我在使用自动布局时遇到了一些问题。

我的类MyView 扩展UIScrollView 并在init 方法中将UIImageView 添加到MyView.view。约束也设置到子视图

    self.imageView.setTranslatesAutoresizingMaskIntoConstraints(false)
    let views:[NSObject : AnyObject] = ["imgView": self.imageView]
    self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[imgView]-0-|", options: nil, metrics: nil, views: views))
    self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[imgView]-0-|", options: nil, metrics: nil, views: views))

我的UIViewController 的子类包含MyView 作为子视图,并且在情节提要中设置了约束。

我想设置MyViewUIImageViewUIImage ViewController 出现之前。问题是,我不确定在哪里设置图像。

func viewWillAppear(animated: Bool) 中设置图像时,尚未应用约束。当设置在func viewDidAppear(animated: Bool)func updateViewConstraints()时,来不及了……

更新:

正如@kdogisthebest 指出的那样,在应用约束之前加载图像是可以的,因为子视图会自动调整大小。

不幸的是,UIScrollView 似乎并非如此...我试图将MyView 的超级视图更改为UIView,并且调整大小的工作如所述。根据一些快速研究,setTranslatesAutoresizingMaskIntoConstraints(false) 应该可以解决问题,但它不起作用。

【问题讨论】:

  • 这真的很重要吗?您已将 UIImageView 的所有侧面固定到它的超级视图。无论如何,它都会是那个大小。如果您在此之前设置图像,它将适合图像并重新绘制,就像您刚刚设置它一样。现在唯一的区别是图像的加载方式:网络或本地。
  • 是的,它将是superview的大小,但是superview的大小不正确,因为尚未应用约束
  • 当应用约束时,它会调用layoutSubviews,这将重绘 UIImageView 和图像。到新尺寸。我在表格单元格中经常这样做。我在添加约束之前设置了图像,它显示得很好。

标签: ios autolayout nslayoutconstraint


【解决方案1】:

当应用约束或更新约束后调用setNeedsUpdateConstraints 时,它将调用layoutSubviews,这将重绘 UIImageView 和图像。到新尺寸。我想稍后再调用setImage 可以避免不必要的平局。

我在表格单元格中经常这样做。我在添加约束之前设置了图像,它显示得很好。

需要注意的重要一点是,只要 UIImageView 的大小发生变化,无论是通过约束还是setFrame,它内部的图像都会重新绘制以适应 UIImageView 的大小。

【讨论】:

  • 不幸的是,UIScrollView 似乎并非如此...我试图将MyView 的超级视图更改为UIView,并且调整大小可以按照您的描述进行。根据一些快速研究,setTranslatesAutoresizingMaskIntoConstraints(false) 应该可以解决问题,但它没有用
猜你喜欢
  • 2011-05-16
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2011-12-27
  • 2017-05-10
相关资源
最近更新 更多