调整从 xib 加载的 UIView 的大小作为 tableHeaderView
Resize UIView loaded from xib as tableHeaderView
我有一个以编程方式创建的 UITableViewController
(没有 xib)。我正在尝试使用从具有自动布局约束的 xib 加载的 UIView
,并将其用作我的 tableHeaderView
(不是 headers 部分)。然后,我需要根据其中包含动态文本的 UILabel
的缩放比例来自动调整 UIView
的大小。
这就是我创建 UIView
的方式:
class HeaderTableLargeHeaderView: UIView {
// Our title label with autolayout constraints
@IBOutlet weak var titleLabel: UILabel!
// Convience method to load for xib
class func instanceFromNib() -> UIView {
return UINib(nibName: "HeaderTableLargeHeaderView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
}
override func layoutSubviews() {
super.layoutSubviews()
titleLabel.preferredMaxLayoutWidth = titleLabel.bounds.width
}
}
然后我尝试在我的UITableViewController
中像这样加载它:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let header = HeaderTableLargeHeaderView.instanceFromNib()
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 100)
let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
var frame = header.frame
frame.size.height = height
header.frame = frame
header.setNeedsLayout()
header.layoutIfNeeded()
tableView.tableHeaderView = header
}
但是我得到了这些错误:
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x7c061050 V:[UILabel:0x7c0b77e0'Label']-(8)-| (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>",
"<NSLayoutConstraint:0x7c0c6590 V:|-(8)-[UILabel:0x7c0b77e0'Label'] (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>",
"<NSLayoutConstraint:0x797576d0 'UIView-Encapsulated-Layout-Height' V:[Care_Com.HeaderTableLargeHeaderView:0x7c04a550(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7c061050 V:[UILabel:0x7c0b77e0'Label']-(8)-| (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>
我想我明白了,但不确定如何解决。我认为它告诉我的是,它无法正确设置 UILabel
的约束,因为它不知道 UIView
的范围......我想。
如果我这样做,我不会收到任何错误并且加载正常,但是高度是静态的 100
。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let header = HeaderTableLargeHeaderView.instanceFromNib()
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 100)
header.setNeedsLayout()
header.layoutIfNeeded()
tableView.tableHeaderView = header
}
我已经尝试设置这些但仍然无济于事:(
self.view.translatesAutoresizingMaskIntoConstraints = false
self.tableView.translatesAutoresizingMaskIntoConstraints = false
我也试过这样做:
header.translatesAutoresizingMaskIntoConstraints = false
它消除了错误但是高度没有调整:
这是你的答案。从上面删除下面的一堆代码,一切都会正常工作。
header.translatesAutoresizingMaskIntoConstraints = false
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 0)
header.setNeedsLayout()
header.layoutIfNeeded()
let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
var frame = header.frame
frame.size.height = height
header.frame = frame
和
titleLabel.preferredMaxLayoutWidth = titleLabel.bounds.width
那些是不必要的。更新了以下 url.
中的存储库
https://github.com/mahesh-agrawal/HeaderTestStack
尽情享受吧:)
我有一个以编程方式创建的 UITableViewController
(没有 xib)。我正在尝试使用从具有自动布局约束的 xib 加载的 UIView
,并将其用作我的 tableHeaderView
(不是 headers 部分)。然后,我需要根据其中包含动态文本的 UILabel
的缩放比例来自动调整 UIView
的大小。
这就是我创建 UIView
的方式:
class HeaderTableLargeHeaderView: UIView {
// Our title label with autolayout constraints
@IBOutlet weak var titleLabel: UILabel!
// Convience method to load for xib
class func instanceFromNib() -> UIView {
return UINib(nibName: "HeaderTableLargeHeaderView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
}
override func layoutSubviews() {
super.layoutSubviews()
titleLabel.preferredMaxLayoutWidth = titleLabel.bounds.width
}
}
然后我尝试在我的UITableViewController
中像这样加载它:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let header = HeaderTableLargeHeaderView.instanceFromNib()
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 100)
let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
var frame = header.frame
frame.size.height = height
header.frame = frame
header.setNeedsLayout()
header.layoutIfNeeded()
tableView.tableHeaderView = header
}
但是我得到了这些错误:
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x7c061050 V:[UILabel:0x7c0b77e0'Label']-(8)-| (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>",
"<NSLayoutConstraint:0x7c0c6590 V:|-(8)-[UILabel:0x7c0b77e0'Label'] (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>",
"<NSLayoutConstraint:0x797576d0 'UIView-Encapsulated-Layout-Height' V:[Care_Com.HeaderTableLargeHeaderView:0x7c04a550(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7c061050 V:[UILabel:0x7c0b77e0'Label']-(8)-| (Names: '|':Care_Com.HeaderTableLargeHeaderView:0x7c04a550 )>
我想我明白了,但不确定如何解决。我认为它告诉我的是,它无法正确设置 UILabel
的约束,因为它不知道 UIView
的范围......我想。
如果我这样做,我不会收到任何错误并且加载正常,但是高度是静态的 100
。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
let header = HeaderTableLargeHeaderView.instanceFromNib()
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 100)
header.setNeedsLayout()
header.layoutIfNeeded()
tableView.tableHeaderView = header
}
我已经尝试设置这些但仍然无济于事:(
self.view.translatesAutoresizingMaskIntoConstraints = false
self.tableView.translatesAutoresizingMaskIntoConstraints = false
我也试过这样做:
header.translatesAutoresizingMaskIntoConstraints = false
它消除了错误但是高度没有调整:
这是你的答案。从上面删除下面的一堆代码,一切都会正常工作。
header.translatesAutoresizingMaskIntoConstraints = false
header.frame = CGRectMake(0, 0, self.view.frame.size.width, 0)
header.setNeedsLayout()
header.layoutIfNeeded()
let height = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
var frame = header.frame
frame.size.height = height
header.frame = frame
和
titleLabel.preferredMaxLayoutWidth = titleLabel.bounds.width
那些是不必要的。更新了以下 url.
中的存储库https://github.com/mahesh-agrawal/HeaderTestStack
尽情享受吧:)