【问题标题】:Resizing UIView based on the subview loaded from xib file根据从 xib 文件加载的子视图调整 UIView 的大小
【发布时间】:2017-09-12 11:27:39
【问题描述】:

我有一个 xib 文件,它的高度可以动态改变,因为它包含多行的标签。我需要将此视图添加为在我的视图控制器中定义的 uiview 的子视图。

let settlementDetailsContentView = SettlementDetailsView.instanceFromNib(nibNamed: NibConstants.SettlementDetailsViewNib)
settlementDetailsContentView.frame = settlementDetailsView.bounds
settlementDetailsView.addSubview(settlementDetailsContentView)

这里的settlementDetailsContentView包含了在Interface中设计的视图 建设者。 settingDetailsView 是我的视图控制器中定义的视图,其高度约束大于或等于零。

下面的代码是根据笔尖名称返回视图的函数

 class func instanceFromNib(nibNamed : String) -> SettlementDetailsView
 {
     return UINib(nibName: nibNamed, bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! SettlementDetailsView
 }

我所做的问题是,由于视图高度没有根据子视图调整大小,因此结算详细信息视图下方的视图与此重叠。

这是 UI 的外观。声明文档重叠 结算详情视图。

uiview 应该是这样的

【问题讨论】:

  • 在添加settlementDetailsContentView 作为子视图后尝试添加settlementDetailsView.setNeedsLayout()
  • 您可以在添加子视图时以编程方式添加高度约束
  • @laxmankhanal setNeedsLayout 不起作用
  • @chirag90 我怎么能找到视图的高度,因为它是动态的,并且某些视图 sinside xib 文件可能会根据某些条件被隐藏
  • 尝试将settlementDetailsView 的 maskToBound 属性设置为 true。还要验证settlementDetailsView的框架是否发生变化

标签: ios swift uiview uiviewcontroller


【解决方案1】:

问题是你没有改变settlementDetailsView的框架。在以下代码中

let settlementDetailsContentView = SettlementDetailsView.instanceFromNib(nibNamed: NibConstants.SettlementDetailsViewNib)
settlementDetailsView.addSubview(settlementDetailsContentView)
settlementDetailsContentView.translatesAutoresizingMaskIntoConstraints = false
settlementDetailsContentView.topAnchor.constraint(equalTo: settlementDetailsView.topAnchor).isActive = true
settlementDetailsContentView.bottomAnchor.constraint(equalTo: settlementDetailsView.bottomAnchor).isActive = true
settlementDetailsContentView.trailingAnchor.constraint(equalTo: settlementDetailsView.trailingAnchor).isActive = true
settlementDetailsContentView.leadingAnchor.constraint(equalTo: settlementDetailsView.leadingAnchor).isActive = true

您约束 subview 增长到 superView 的完整大小或 superView 缩小到 subview 的大小(这取决于 superview 的约束和两者的拥抱/压缩,但应该给你的愿望效果)。

请参阅autolayout 参考

编辑

现在您已经发布了它的外观,下面的代码完成了它:

let superView = settlementDetailsView.superview!
let settlementDetailsContentView = SettlementDetailsView.instanceFromNib(nibNamed: NibConstants.SettlementDetailsViewNib)
superview.addSubview(settlementDetailsContentView)
settlementDetailsContentView.translatesAutoresizingMaskIntoConstraints = false
settlementDetailsContentView.topAnchor.constraint(equalTo: settlementDetailsView.bottomAnchor).isActive = true
settlementDetailsContentView.bottomAnchor.constraint(equalTo: superview.bottomAnchor).isActive = true
settlementDetailsContentView.trailingAnchor.constraint(equalTo: superview.trailingAnchor).isActive = true
settlementDetailsContentView.leadingAnchor.constraint(equalTo: superview.leadingAnchor).isActive = true

请注意,如果settlementDetailsView 对其 superView 有底部约束,则应停用它。

【讨论】:

  • 还是同样的问题.. UIView 看起来和上面的截图一样。
  • 作为测试,尝试手动更改settlementDetailsView 框架。还要检查settlementDetailsContentView 是否与superView 具有相同的框架。也许视图的颜色很清晰
  • 我应该将结算详细信息视图框架设置为什么?您所说的视图颜色清晰是什么意思?你是说背景吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2014-09-02
  • 2013-04-12
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多