Размер изображения в формате помещается в UITableviewCell неправильно загружается

Я использую SDWebImage загрузить изображение через интернет и отобразить в TableViewCell.Мое изображение не помещается точно над ячейкой при загрузке, но когда я прокручиваю, оно идеально подходит. Мой код для cellForRowAtIndexPath является

cell = tableView.dequeueReusableCellWithIdentifier("cell") as! AgentPostTableViewCell

        let str = apiData[indexPath.row].valueForKey("multiple_images")?.objectAtIndex(0) as? String
        cell.agentimage.image = nil
        cell.agentimage.clipsToBounds = true
        if str != nil && str?.isEmpty == false{
            let url = NSURL(string: imageUrl + str!)

            let block: SDWebImageCompletionBlock = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType!, imageURL: NSURL!) -> Void in
                if tableView.visibleCells.contains(cell){
                    cell.setPostedImage(cell.agentimage.image!)
                cell.layoutIfNeeded()
                cell.layoutSubviews()

                }
            }
            cell.agentimage.sd_setImageWithURL(url, placeholderImage: UIImage(named: "o"), completed: block)
            cell.setPostedImage(cell.agentimage.image!)
            print("post image " + imageUrl + str!)
        }

Для изменения размера при загрузке я использую этот код

func setPostedImage(image : UIImage) {

    let aspect = image.size.width / image.size.height

    aspectConstraint = NSLayoutConstraint(item: agentimage, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: agentimage, attribute: NSLayoutAttribute.Height, multiplier: aspect, constant: 0.0)

    agentimage.image = image
}

Проблема в том, что при загрузке он не помещается должным образом на вид, но после прокрутки он правильно помещается в вид.

перед прокруткой

это загруженный вид

после того, как я прокручиваю и возвращаюсь, это вид введите описание изображения здесь

2 ответа

Вы создаете аспектное ограничение, но не активируете его.

Я бы посоветовал не использовать ограничение сторон и заменить его на изображение. contentMode

Я думаю, что вам нужно использовать scaleAspectFit или scaleAspectFill

Если вы хотите использовать ограничение, создайте его из раскадровки, создайте IBOutlet в ячейке и измените константу ограничения.

Хорошо, я думаю, вам нужно обновить таблицу. Добавьте фиксированное ограничение высоты в ячейку, которым вы можете манипулировать, а затем измените его динамически. Вот пример

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "funCell", for: indexPath) as! FunTableViewCell
    //your url will go here
    let url = URL(string: array[indexPath.row])!
    cell.agentimage.image = nil
    cell.agentimage.sd_cancelCurrentImageLoad()
    cell.agentimage.sd_setImage(with: url, completed: {
        (image, error, cacheType, imageURL) -> Void in
        if image != nil{
            let aspect = image!.size.width / image!.size.height
            //or whatever width you are wanting to constrain it to
            let ourHeight = cell.bounds.width * aspect
            if cell.heightConstraint.constant != ourHeight{
                cell.heightConstraint.constant = ourHeight
                cell.agentimage.image = image
                //most important lines as it would make your constraint work
                tableView.beginUpdates()
                tableView.endUpdates()
            }

        }
    })
    return cell
}

Вы также можете перезагрузить определенный путь индекса

tableView.reloadRows(at: [indexPath], with: .fade)

Проверка ограничения очень важна, потому что нет причины сбрасывать ее, если она не нуждается в сбросе. Также, чтобы помочь с плавностью, вы можете использовать словарь размеров изображения или пропорций, чтобы вам не приходилось каждый раз вычислять.

ура

Другие вопросы по тегам