Swift, custom UITableViewCell with UIImageView. Ne

2019-03-20 18:52发布

I'am trying to make app, that will show images in table view. I have custom cell with image view. It only must download image data from url:

@IBOutlet weak var tweetImage: UIImageView!
var imageData : MediaItem? { didSet { updateUI() }}

func updateUI(){
    tweetImage.image = nil
    if let url = imageData?.url {
        if let data = NSData(contentsOfURL: url) {
            tweetImage.image = UIImage(data: data)
        }
    }
}

I need to get the cell height was changed after the download. It must be equal to the height of the image. I set auto dimension in viewController:

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = tableView.rowHeight
        tableView.rowHeight = UITableViewAutomaticDimension
    }

I set "aspect fit" to image, I get strange results. The image extends beyond the boundaries of the cell. Maybe i need to set some constraints... I don't know.

Results:

result of it

But i need this:

nice result

3条回答
何必那么认真
2楼-- · 2019-03-20 19:41

Of course, you need to set constraints for your image in the cell

screenshot

Maybe this screenshot will help you

查看更多
Ridiculous、
3楼-- · 2019-03-20 19:47

If you want to use dinamic table with UITableViewAutomaticDimension, then you need to set your constraint properly (image). (for correct width and height, I suggest you to use aspect ratio)

With static table view, you should implement optional func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat, and count the cell size manually.

查看更多
冷血范
4楼-- · 2019-03-20 19:52

If you want to load images async:

After you load and set new UIImage, you can reload specific cell via UITableView function:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

In your UIViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.estimatedRowHeight = tableView.rowHeight
    tableView.rowHeight = UITableViewAutomaticDimension
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "imageDidLoadNotification:", name:"CellDidLoadImageDidLoadNotification", object: nil)
}

func imageDidLoadNotification(notification: NSNotification) {
    if  let cell = notification.object as? UITableViewCell
        let indexPath = tableView.indexPathForCell(cell) {
        tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
    }
}

In your UITableViewCell

func updateUI(){
    tweetImage.image = nil
    if let url = imageData?.url {
        if let data = NSData(contentsOfURL: url) {
            tweetImage.image = UIImage(data: data)
            NSNotificationCenter.defaultCenter().postNotificationName("CellDidLoadImageDidLoadNotification", object: self)
        }
    }
}
查看更多
登录 后发表回答