如何在自定义 UITableViewCell 中创建 UIImageVIew? (迅速)

Posted

技术标签:

【中文标题】如何在自定义 UITableViewCell 中创建 UIImageVIew? (迅速)【英文标题】:How to create UIImageVIew in custom UITableViewCell? (Swift) 【发布时间】:2016-03-19 18:40:36 【问题描述】:

我在UIViewController 中有一个UITableView,还有一个在我自己的自定义单元类中定义的原型单元。我在右上角有一个UIImageView,带有顶部和尾部边距约束,以及固定的宽度和高度:

In Interface Builder

问题是,当我运行程序时,TableView 已创建,但 imageView 过大:

At runtime

在这个网站上研究了一些类似的问题后,我得出的结论是:

单元格的 imageView 仅在您分配 图像。

我已经在自定义单元类中尝试了以下代码,以及cellForRowAtIndexPath 函数:

cell.imageView?.frame = CGRectMake(300, 52, 292, 136)
cell.imageView?.clipsToBounds = true
cell.contentView.addSubview(cell.imageView!)

我是否遗漏了什么或者我该怎么做才能使imageView 达到我对其进行限制的大小?

提前谢谢你!

【问题讨论】:

是的,您需要在单元格的包含视图中添加约束,并且无需以编程方式设置 imageView 的框架。例如:postimg.org/image/utqzbrjn1 你能在storyboard中给你的tableviewCell截图吗?如果您向我们展示您的限制,它会有所帮助。广告也可以在cellForRowAtIndexPath 下显示您的完整代码。 【参考方案1】:

UIView 具有属性 contentMode - 尝试将其定义为 ScaleToFill:

self.someImage.contentMode = .ScaleToFill 

【讨论】:

【参考方案2】:

感谢大家的帮助!

我犯了一个愚蠢的错误,因为我引用了自定义单元格的通用 imageView?,而不是我用不同名称创建的 IB Outlet

错误:

cell.imageView?.image = UIImage(named: "whatever name")

对:

cell.dogImageView.image = UIImage(named: "labrador")

【讨论】:

【参考方案3】:

出于兴趣,固定宽度和高度约束的值是多少?由于视图控制器的大小不同,很难区分界面构建器和设备屏幕截图。

我的建议是取消固定的宽度和高度限制,而是:

• 将图像视图的底部固定到单元格的底部 - 这为图像视图提供了高度。

• 为图像视图添加纵横比约束 - 这会根据其高度为图像视图提供宽度。

这意味着即使您最终更改了单元格的高度,您的图像视图也将始终位于单元格内。

感谢使用原型单元格和 UITableViewCell 子类 - 我完全同意这种方法!

【讨论】:

感谢马修的快速回复!我已经尝试了你的建议,但它给了我相同的结果。宽度为 292,高度为 136。我应该提到该设备是 iPhone 6。imageView 是唯一的问题,似乎是因为它的约束没有被应用。 你能否提供更多关于设置表格视图本身的代码,以及 cellForRowAtIndexPath: 方法?然后我们也许可以查看您是否在做不应该做的事情,或者忘记做您应该做的事情!【参考方案4】:

尽管我同意您使用自定义单元类,但您的代码似乎含糊不清。这样做是尝试下载所有图像集,如果无法下载,它将用保存在资产上的图像占位符替换图像。所有图像在加载时具有相同的大小。

您可以采取以下措施使其发挥作用。这是您的自定义类。

class SomeCell: UITableViewCell 

    @IBOutlet weak var imgMain: UIImageView!
    @IBOutlet weak var lblMain: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
        imgMain.layer.cornerRadius = 5.0
        imgMain.clipsToBounds = true
    

    override func setSelected(selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    

    func configureCell(image: UIImage, text: String)
        imgMain.image = image
        lblMain.text = text
    


然后在你的 ViewController 上

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet weak var tableView: UITableView!

    var somePics = ["http://www.something.com/pic1.jpg","http://www.something.net/pic2.jpg","http://www.something.com/pic3.jpg","http://www.something.com/pic4.jpg","http://www.something.net/pic5.jpg"]

    var someTitles = ["Picture 1", "Picture 2", "Picture 3", "Picture 4", "Picture 5"]

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        // Do any additional setup after loading the view, typically from a nib.
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        if let cell = tableView.dequeueReusableCellWithIdentifier("SomeCell") as? SomeCell 

            var img: UIImage!

            let url = NSURL(string: somePics[indexPath.row])!

            if let data = NSData(contentsOfURL: url) 
                img = UIImage(data: data)
            else 
                img = UIImage(named: "somePlaceholderpic")
            

            cell.configureCell(img, text: someTitles[indexPath.row])

            return cell

         else 

            return SomeCell()

        
    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return somePics.count
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    



希望这会有所帮助。 :)

【讨论】:

以上是关于如何在自定义 UITableViewCell 中创建 UIImageVIew? (迅速)的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 UITableViewCell 中调整 UIImageView 的大小会产生不一致的结果

在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow

如何在自定义 UITableViewCell 中增加 Label 的高度

如何在自定义 UITableViewCell 中控制 UITextFields 的编辑

带有自定义 UITableViewCell 的 AVPlayer

如何借助 AutoLayout 在自定义 UITableviewCell 中添加自定义 UIView(xib)?