数日苦労した後、UIButtonのタイトルと画像の端のインセットについてお聞きしたいと思いました...ボタン付きのカスタムセルがあり、そのボタンはセルの種類に応じて異なるアイコンとテキストである必要がありますが、要件のテキストは中央に配置する必要があり、画像は可能です左揃えまたは右揃え。そのために、ボタン タイルと画像の更新中にエッジ インセットを設定しています。簡単にするために、画像のインセットを 8 にし、テキストを開始するタイトルの左側の計算ポイントをハードコーディングしました。
func setTitleWithImage(_ title: String, imageName: String) {
self.btnStatus.setTitle(title, for: .normal)
self.btnStatus.setImage(UIImage(named: imageName), for: .normal)
self.btnStatus.imageEdgeInsets.left = 8
let btnWidth = btnStatus.frame.width
let titleLabelWidth = btnStatus.titleLabel?.frame.width
self.btnStatus.titleEdgeInsets.left = (btnWidth / 2) - (titleLabelWidth! / 2) - (btnStatus.imageView?.frame.width)! + self.btnStatus.imageEdgeInsets.left
}
問題は、テーブルビューがロードされたときに間違って配置されているが、セルをスクロール/再描画した後、正しく配置されることです。さまざまな提案を試みましたが、誰も助けてくれませんでした。
スクロール前
スクロール後
ここでより具体的に言うと、プロジェクト全体です。
更新しました
ViewController ほとんどすべての詳細については、ソースをダウンロードしてください
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 140
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomTableViewCell
cell.setTitleWithImage("DIFFERENT TEXT IS HERE ?", imageName: "icon")
cell.layoutIfNeeded()
cell.setNeedsLayout()
return cell
}

