自定义UITableViewCell图像上的圆角

时间:2016-11-26 16:25:00

标签: ios swift uitableview uiimage

我试图将半径应用到表格中显示的图像的角落,使它们看起来像一个圆圈。问题是图像是通过自动布局定位的,所以在视图布局了所有子视图之前不会计算最终大小,之后我需要对圆形掩码进行编码。

我遇到的解决方案是在方法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
    }
     */

}

如果我在模拟器上运行这些代码,我会得到这个:

enter image description here

但是如果我删除了didMoveToSuperview()方法的注释并让它改变了半径,我得到了这个:

enter image description here

在此之后,我在didMoveToSuperview()中写道:

print(self.contactImage.frame.height)

它的高度为177.0,因此我不知道错误的位置。

4 个答案:

答案 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