我UITableView
里面有一個自定義單元格,稱為NewsCell
. 在里面NewsCell
我有一個UIView
用作操作按鈕的自定義。
很多時候,當TableView
加載單元格時,自定義操作按鈕會在單元格頂部出現幾秒鐘,直到它回傳到單元格底部的正確位置。有時它只有在我將單元格滾動出視口后才會回傳到正確的位置。
知道為什么會這樣嗎?
這是一張讓事情更清楚的照片: 動作按鈕不合適
NewsCell 是使用 .xib 檔案創建的,相關代碼如下:
protocol NewsCellDelegate {
func favoriteIconDidPress(forArticle article: Article)
func actionButtonDidPress(inside article: Article)
}
enum ArticleFavoriteMark {
case selected
case notSelected
}
class NewsCell: UITableViewCell, MainActionButtonDelegate{
@IBOutlet weak var entireNewsCell: UIView!
@IBOutlet weak var newsImage: UIImageView!
@IBOutlet weak var favoriteIcon: UIImageView!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var subjectTag: UIButton!
@IBOutlet weak var moreSubjectsTag: UIButton!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var authorLabel: UILabel!
@IBOutlet weak var summaryLabel: UILabel!
@IBOutlet weak var actionButton: MainActionButtonView!
var delegate: NewsCellDelegate?
var articleUrl = ""
var articleID = ""
var articleImageUrl = ""
var isFavorite: Bool = false
override func awakeFromNib() {
super.awakeFromNib()
setCellBorder()
setCellColorsDesign()
setImageRounded()
setTagsRounded()
setGestureRecognizer()
actionButton.delegate = self
}
override func layoutSubviews() {
super.layoutSubviews()
contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0))
}
func setGestureRecognizer() {
favoriteIcon.addGestureRecognizer(UITapGestureRecognizer(target: favoriteIcon, action: #selector(favoriteIconPressed)))
favoriteIcon.isUserInteractionEnabled = true
let tapGestureRecognizer1 = UITapGestureRecognizer(target: self, action: #selector(favoriteIconPressed(tapGestureRecognizer:)))
favoriteIcon.addGestureRecognizer(tapGestureRecognizer1)
}
@objc func favoriteIconPressed(tapGestureRecognizer: UITapGestureRecognizer) {
let currentArticle = Article(id: articleID, articleTitle: titleLabel.text!, date: dateLabel.text ?? "", url: articleUrl, content: summaryLabel.text!, author: authorLabel.text ?? "", topic: subjectTag.currentTitle!, imageUrl: articleImageUrl , isFavorite: isFavorite)
delegate?.favoriteIconDidPress(forArticle: currentArticle)
}
func actionButtonDidPress(btnText: String) {
let currentArticle = Article(
id: articleID,
articleTitle: titleLabel.text ?? "",
date: dateLabel.text ?? "",
url: articleUrl,
content: summaryLabel.text ?? "",
author: authorLabel.text ?? "",
topic: subjectTag.currentTitle ?? "",
imageUrl: articleImageUrl,
isFavorite: self.isFavorite)
delegate?.actionButtonDidPress(inside: currentArticle)
}
}
這是我的NewsCell
元素層次結構:
新聞單元格元素
這些是我對內部操作按鈕的約束NewsCell
:
NewsCell 內操作按鈕的約束
這就是我如何約束ActionButton
UIView
:
動作按鈕自定義 uiview 中的約束
在我的 TableView 中,我像這樣啟動每個單元格:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let currentCell = tableView.dequeueReusableCell(withIdentifier: Constants.TableCellsIdentifier.FAVORITES, for: indexPath) as! SavedArticleCell
currentCell.delegate = self
let currentKey = viewModel.keysArray[indexPath.row]
let savedArticle = viewModel.savedArticles[currentKey]
if let savedArticle = savedArticle {
currentCell.articleID = savedArticle.id!
currentCell.articleTitle.text = savedArticle.title
currentCell.articleTopic.setTitle(savedArticle.topic, for: .normal)
if let imageUrl = savedArticle.imageUrl {
currentCell.articleImageURL = imageUrl
currentCell.articleImage.sd_setImage(with: URL(string: imageUrl), placeholderImage: UIImage(named: "light-gray-background"))
} else {
currentCell.articleImage.image = UIImage(named: "light-gray-background")
}
}
return currentCell
}
uj5u.com熱心網友回復:
你必須contentView.layoutIfNeeded()
添加layoutSubViews()
方法NewsCell
override func layoutSubviews() {
super.layoutSubviews()
contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0))
contentView.layoutIfNeeded()
}
的目的layoutIfNeeded()
是強制同步(本質上是“立即”)重繪視圖及其子視圖。您必須呼叫它,因為您已經更新了layoutsubviews()
方法中的布局。關于layoutIfNeeded()
這是Apple所說的。
使用此方法強制視圖立即更新其布局。使用自動布局時,布局引擎會根據需要更新視圖的位置以滿足約束的變化。使用接收訊息的視圖作為根視圖,該方法從根開始布局視圖子樹。如果沒有待處理的布局更新,則此方法退出而不修改布局或呼叫任何與布局相關的回呼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/459732.html