我有一个动态单元格,每个单元格底部图像下面有两个图像和两个按钮。标签的大小取决于标签中的行数,可以是任何内容。我在cellForRowAt indexPath
中获得了标签的文字。在我的viewDidLoad()
中,我已经通过使用它来设置动态单元格:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 265
问题:当标签超过1行时,单元格高度的大小不会改变。在两个实例中它只有正确的大小:1)当我刷新表时。 2)当我向下滚动时,破碎的单元格不在视图中,然后当我向上滚动时,破碎的单元格位于正确的位置。
我尝试了什么:经过几个小时的尝试来解决这个问题后,有许多消息来源说了同样的事情:1)确保所有物品都有所有物品的限制双方(我这样做,同样的问题发生了)。 2)唯一的另一个人说要使用UITableViewAutomaticDimension
和estimatedRowHeight
(我有)。
我如何解决这个或我错过了什么?
编辑:我在获得哪种类型的单元格之后调用cellForRowAt indexPath
中的标签文本(我有3个,他们都做不同的事情)。这是代码:
func loadNews() {
//start finding followers
let followQuery = PFQuery(className: "Follow")
followQuery.whereKey("follower", equalTo: PFUser.current()?.objectId! ?? String())
followQuery.findObjectsInBackground { (objects, error) in
if error == nil {
self.followArray.removeAll(keepingCapacity: false)
//find users we are following
for object in objects!{
self.followArray.append(object.object(forKey: "following") as! String)
}
self.followArray.append(PFUser.current()?.objectId! ?? String()) //so we can see our own post
//getting related news post
let newsQuery = PFQuery(className: "News")
newsQuery.whereKey("user", containedIn: self.followArray) //find this info from who we're following
newsQuery.limit = 30
newsQuery.addDescendingOrder("createdAt")
newsQuery.findObjectsInBackground(block: { (objects, error) in
if error == nil {
//clean up
self.newsTypeArray.removeAll(keepingCapacity: false)
self.animalArray.removeAll(keepingCapacity: false)
self.newsDateArray.removeAll(keepingCapacity: false)
for object in objects! {
self.newsTypeArray.append(object.value(forKey: "type") as! String) //get what type (animal / human / elements)
self.animalArray.append(object.value(forKey: "id") as! String) //get the object ID that corresponds to different class with its info
self.newsDateArray.append(object.createdAt) //get when posted
}
self.tableView.reloadData()
} else {
print(error?.localizedDescription ?? String())
}
})
} else {
print(error?.localizedDescription ?? String())
}
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let type = newsTypeArray[indexPath.row]
if type == "element" {
//fills cell just like animal one
} else if type == "human" {
//fills cell just like animal one
} else { //its an animal cell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! AnimalCell
let query = query(className: "Animals")
query.whereKey("objectId", equalTo: animalArray[indexPath.row])
query.limit = 1
query.findObjectsInBackground(block: { (objects, error) in
if error == nil {
for object in objects! {
let caption = (object.object(forKey: "caption") as! String)
cell.captionLabel.text = caption
}
} else {
print(error?.localizedDescription ?? String())
}
})
return cell
}
}
答案 0 :(得分:1)
1。检查您是否在单元格中使用了正确的constraints
。
<强> 2 即可。实现这些UITableViewDelegate
方法:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
{
return 265
}
删除这两行:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 265
<强>截图:强>
<强> 1。查看层次结构:Image1 - &gt;标签 - &gt; Image2 - &gt; Button1 - &gt; BUTTON2
<强> 2。输出强>
如果它不起作用仍然存在:
在您的自定义preferredMaxLayoutWidth
中提供UILabel
UITableViewCell
,即
override func awakeFromNib()
{
super.awakeFromNib()
self.label.preferredMaxLayoutWidth = UIScreen.main.bounds.width //Provide here the calculated width of your label
}
UITableViewDataSource
方法:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return 2
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableCell
if indexPath.row == 0
{
cell.label.text = "When the label is more than 1 line, the size of the height of the cell does not change."
}
else
{
cell.label.text = "When the label is more than 1 line, the size of the height of the cell does not change. It only chances to the correct size in two instances: 1) When I refresh the table. 2) when I scroll down where the broken cell is not in the view then when I scroll back up the broken cell is at the correct position."
}
return cell
}
答案 1 :(得分:0)
这听起来像是在加载初始表数据后设置标签的内容(可能使用后台方法从网络中获取值?)。
如果是这种情况,您可以使用UITableView.reloadRows(at:with:)
方法重新加载表格中的那个单元格。请参阅:https://developer.apple.com/documentation/uikit/uitableview/1614935-reloadrows
例如:tableView.reloadRows(at: [indexPathToCell], with: .automatic)