【问题标题】:UITableViewAutomaticDimension + AFNetworkingUITableViewAutomaticDimension + AFNetworking
【发布时间】:2015-06-09 15:23:58
【问题描述】:

我正在从 API 加载图像,它们具有不同的高度并显示在包含其他类型单元格的 UITableView 中(我使用 UITableViewAutomaticDimension 的原因)

我想使用图像高度显示(或重新加载)包含图像的单元格,以避免失真。

我尝试了不同的解决方案,但我很难让它发挥作用? 有关如何解决此问题的任何提示或建议?

谢谢

编辑:

我在这里上传了一个示例项目https://github.com/LucasCoelho/ImageLoading

崩溃错误是

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 9 beyond bounds [0 .. 8]'

我认为这可能与那些冲突的 NSAutolayoutConstraints 有关

(
    "<NSLayoutConstraint:0x7f85db176750 V:[UIImageView:0x7f85db17a090(72)]>",
    "<NSLayoutConstraint:0x7f85db18ca90 V:|-(0)-[UIImageView:0x7f85db17a090]   (Names: '|':UITableViewCellContentView:0x7f85db179f70 )>",
    "<NSLayoutConstraint:0x7f85db18cb80 V:[UIImageView:0x7f85db17a090]-(0)-|   (Names: '|':UITableViewCellContentView:0x7f85db179f70 )>",
    "<NSLayoutConstraint:0x7f85db197e50 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f85db179f70(128)]>"
)

【问题讨论】:

    标签: ios iphone uitableview cocoa-touch afnetworking


    【解决方案1】:

    首先,您需要为 imageView 添加高度约束,并从 UITableViewCell 子类创建对它的引用。

    class TableViewCell: UITableViewCell {
          @IBOutlet weak var imageView: UIImageView!
          @IBOutlet weak var imageViewHeightConst: NSLayoutConstraint!
    }
    

    然后利用UIImageView+AFNetworking.h方法:

    - (void)setImageWithURLRequest:(NSURLRequest *)urlRequest
              placeholderImage:(UIImage *)placeholderImage
                       success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                       failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure;
    

    在成功块中,您需要将下载的图像设置为 imageView 并更新 imageViewHeightConst 常量属性。

    imageView.image = image
    imageViewHeightConst.constant = image.size.height
    

    您还需要一种方法来通知您的 tableview 图像已下载并且应该更新 tableview。所以你可以使用委托模式来解决这个问题。在委托方法的实现中,您可以使用以下代码更新表格视图:

     tableView.beginUpdates()
     tableView.endUpdates() 
    

    最终,您的单元子类将如下所示:

    @objc protocol TableViewCellDelegate {
        func tableViewCell(cell: UITableViewCell, didLoadImage: UIImage)
    }
    
    class TableViewCell: UITableViewCell {
        @IBOutlet weak var photoImageView: UIImageView!
        @IBOutlet weak var imageViewHeightConst: NSLayoutConstraint!
    
        weak var delegate: TableViewCellDelegate?
    }
    
    extension TableViewCell {
    
        func configureCellForURL(url: NSURL, placeholderImage: UIImage) {
            let request = NSURLRequest(URL: url)
            photoImageView.setImageWithURLRequest(request, placeholderImage: placeholderImage, success: { [weak self] (request, response, image) -> Void in
    
                self?.photoImageView?.image = image
                self?.imageViewHeightConst?.constant = image.size.height
                self?.delegate?.tableViewCell(self!, didLoadImage: image)
    
            }) { (request, response, error) -> Void in
    
            }
        }
    }
    

    【讨论】:

    • 我仍然遇到崩溃。我上传了一个有问题的项目。你介意看看吗?谢谢罗马
    • 我已经解决了您的问题并创建了拉取请求。查看您的 github 示例项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多