UITableView 中的 UIImageview:滚动或点击时意外调整大小

Posted

技术标签:

【中文标题】UITableView 中的 UIImageview:滚动或点击时意外调整大小【英文标题】:UIImageview in UITableView: unexpected resizing on scroll or tap 【发布时间】:2015-09-05 12:00:20 【问题描述】:

我的一个 tableView 遇到问题,当我解码 JSON 并将我的 imageview 设置为大小约束时,它可以工作,但是当我滚动 tableview 或点击图像时,imageview 恢复到其原始大小。

我使用自定义单元格来避免此类问题,但它不起作用:

第一次加载:

点击或滚动:

我的自定义单元格:

class CustomCell: UITableViewCell 


@IBOutlet var picture: UIImageView!
@IBOutlet var title: UILabel!
@IBOutlet var price: UILabel!


override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code


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

    // Configure the view for the selected state



我的 tableView 功能:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    var cell:CustomCell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomCell

    tableView.tableFooterView = UIView(frame:CGRectZero)
    tableView.separatorColor = UIColor.whiteColor()
    tableView.backgroundColor = UIColor(rgb: 0x007AFF)
    cell.backgroundColor = UIColor(rgb: 0x007AFF)

    cell.title.text =  repos[indexPath.row].title
    cell.price.text = repos[indexPath.row].price

    let urlString = repos[indexPath.row].picture_url! as String,
    imgURL = NSURL(string: urlString as String)

        // If this image is already cached, don't re-download
        if let img = imageCache[repos[indexPath.row].picture_url!] 
            cell.picture.image = img
            cell.picture.frame = CGRectMake(5,0,61,43)
            println("image présente")
        

        else 

            loading.startAnimating()
            // The image isn't cached, download the img data
            // We should perform this in a background thread
            let request: NSURLRequest = NSURLRequest(URL: imgURL!)
            let mainQueue = NSOperationQueue.mainQueue()
            NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler:  (response, data, error) -> Void in
                if error == nil 
                    // Convert the downloaded data in to a UIImage object
                    let image = UIImage(data: data)
                    // Store the image in to our cache
                    self.imageCache[repos[indexPath.row].picture_url!] = image
                    // Update the cell

                    dispatch_async(dispatch_get_main_queue(), 
                        if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) 
                            cellToUpdate.imageView?.image = image
                            cellToUpdate.imageView?.frame = CGRectMake(5,0,61,43)

                            println("image reload")
                        
                    )
                
                else 
                    println("Error: \(error.localizedDescription)")
                
            )
        loading.stopAnimating()
        
    return cell

你知道问题出在哪里吗?

谢谢

【问题讨论】:

有答案了吗? 是的,看看我下面的评论。 【参考方案1】:

解决问题的简单方法是在 CustomCell 中设置 AutoLayout。

您所要做的就是设置宽度和高度。像这样,

作为补充,最好根据需要调整UIImageView的contentMode和clipsToBounds。

【讨论】:

好的,我试过了,现在可以了,但只适用于第一行!其他人仍在调整大小【参考方案2】:

好的,我解决了问题,实际上在我的代码中,如果我的图片尚未缓存,我会重新下载它,完成后我放入一个新的 tableviewcell (cellToUpdate),并且我没有为 UIImageView 定义这个单元格,顺便说一下,我使用了默认的“imageView?”,它将我的图像调整为默认值。

我刚刚将我的 cellToUpdate 替换为我的 customCell 的名称,用我的自定义 imageView,它可以工作:

cell.picture.image = image
cell.picture.frame = CGRectMake(5,0,61,43)

【讨论】:

以上是关于UITableView 中的 UIImageview:滚动或点击时意外调整大小的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 中的 UIView 中的 UITableView :点击时 UITableView 数据被清除

为啥第一次滚动到另一个 UITableView 中的 UICollectionView 中的 UITableView 不加载数据?

水平 UITableView 中的垂直 UITableView

在 UITableView 中的 UINib 中重新加载 UITableView

尝试在用户向 iOS 中的 UITableView 添加行时动态增加 UITableView 的高度

UIViewController 中的 UITableView