我试图将半径应用到表格中显示的图像的角落,使它们看起来像一个圆圈。问题是图像是通过自动布局定位的,所以在视图布局了所有子视图之前不会计算最终大小,之后我需要对圆形掩码进行编码。
我遇到的解决方案是在方法tableView(... willDisplayCell ...)中编写代码,或者在自定义UITableViewCell子类的方法doMoveToSuperview()和layoutSubviews()内编写代码。我已经在这个论坛的一些问题上看到了这个解决方案,但没有一个人在工作。
以下是使用其中一种方法评论的代码:
import UIKit
struct Contact {
var name: String
var image: UIImage
}
class ActiveChatsController: UITableViewController {
let contacts = [
Contact(name: "Alex", image: UIImage(named: "Alex")!),
Contact(name: "Puto Albert", image: UIImage(named: "Albert")!),
Contact(name: "Golfo-man", image: UIImage(named: "Pablo")!)
]
override func viewDidLoad() {
self.navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: AppDesign.color(withIntensity: 6)]
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return contacts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = Bundle.main.loadNibNamed("OpenedChatCell", owner: self, options: nil)?.first as! OpenedChatCell
cell.contactImage.image = contacts[indexPath.row].image
cell.contactName.text = contacts[indexPath.row].name
return cell
}
}
自定义单元子类来自XIB文件:
import UIKit
class OpenedChatCell: UITableViewCell {
@IBOutlet weak var contactImage: UIImageView!
@IBOutlet weak var contactName: UILabel!
/*
override func didMoveToSuperview() {
self.contactImage.layer.cornerRadius = self.contactImage.frame.width / 2
self.contactImage.clipsToBounds = true
}
*/
}
如果我在模拟器上运行这些代码,我会得到这个:
但是如果我删除了didMoveToSuperview()方法的注释并让它改变了半径,我得到了这个:
在此之后,我在didMoveToSuperview()中写道:
print(self.contactImage.frame.height)
它的高度为177.0,因此我不知道错误的位置。
答案 0 :(得分:1)
问题可能是在最终设置图像视图的帧之前,正在创建表视图本身。因此,所有你设置圆角的尝试也发生得太早,因为它们都依赖于表格视图的初始形成。
在这种情况下,解决方案如下:
var didLayout = false
override func viewDidLayoutSubviews() {
if !self.didLayout {
self.didLayout = true // only need to do this once
self.tableView.reloadData()
}
}
如果您已将代码移到此委托方法中:
func tableView(UITableView, willDisplay cell: UITableViewCell,
forRowAt indexPath: IndexPath)
...该方法现在将再次为表格的所有单元格运行,图像视图框架将正确,圆角将正确显示。
答案 1 :(得分:0)
尝试ovveride layoutSubviews而不是didMoveToSuperview:
override func layoutSubviews() {
super.layoutSubviews()
self.contactImage.layer.cornerRadius = self.contactImage.frame.width / 2
self.contactImage.clipsToBounds = true
}
答案 2 :(得分:0)
试一试。它可能有用
import UIKit
class OpenedChatCell: UITableViewCell {
@IBOutlet weak var contactImage: UIImageView!
@IBOutlet weak var contactName: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
setRoundedView(roundedView: customImageView)
}
func setRoundedView (roundedView:UIView) {
let saveCenter = roundedView.center
let newFrame:CGRect = CGRect(origin: CGPoint(x: roundedView.frame.origin.x,y :roundedView.frame.origin.y), size: CGSize(width: roundedView.frame.size.width, height: roundedView.frame.size.height))
roundedView.layer.cornerRadius = roundedView.frame.height/2
roundedView.frame = newFrame;
roundedView.center = saveCenter
roundedView.clipsToBounds = true
}
}
答案 3 :(得分:0)
如果您已经知道图像的大小并且不需要即时确定(通常在表格视图中就是这种情况),则可以这样尝试:
let imageHeight = CGFloat(100)
imageView.layer.masksToBounds = true
imageView.layer.cornerRadious = imageHeight / 2