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

时间:2015-09-05 12:00:21

标签: ios swift uitableview uiimageview custom-cell

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

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

首次加载:

First load :

点击或滚动:

On tap or Scroll

我的自定义单元格:

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
}

您是否知道问题出在哪里?

谢谢

2 个答案:

答案 0 :(得分:0)

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

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

enter image description here

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

答案 1 :(得分:0)

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

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

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