Dynamic UIImageView Size Within UITableView

前端 未结 6 1365
伪装坚强ぢ
伪装坚强ぢ 2020-12-04 13:46

I want to implement a TableView with a Custom TableViewCell showing an image.

To make this simple, I simply put a UIImageView inside a tableviewcell using autolayout

6条回答
  •  臣服心动
    2020-12-04 14:09

    1. make sure you have set top-bottom constraints in storyboard.
    2. save the thumbnail/image as data to local storage (I'm using core data)
    3. using the thumb image, calculate the aspect of the image
    4. customise the row height as you want in heightForRowAt method.
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            let entity = self.fetchedResultController.object(at: indexPath as IndexPath) as! Message
            var newh:CGFloat = 100.00
    
            if let fileThumbnails =  entity.file_thumbnails as? NSArray{
                if fileThumbnails.count != 0{
                    fileThumbnails.map { (thumbNail) in
                        newh = self.getImageHeight(image:UIImage(data: thumbNail as! Data)! , h: UIImage(data: thumbNail as! Data)!.size.height , w: UIImage(data: thumbNail as! Data)!.size.width)
                    }
    
                }
    
            }
    
            if entity.fileStatus == "DeletedMedia" {
                newh = 100
            }
            if entity.fileStatus == nil{
                newh = 0.0
            }
            print ("newH " , newh)
            return newh
        }
        func getImageHeight(image : UIImage, h : CGFloat, w : CGFloat) -> CGFloat {
            let aspect = image.size.width / image.size.height
            var newH = (messagesTV.frame.size.width) / aspect
            // customise as you want in newH
            if(newH > 500){
                newH = 500
               //maximum height 500
            }
            if(newH < 100){
                newH = 100
                //minimum height = 100
            }
            return newH
        }
    

    if the thumb image is deleted in local storage then a placeholder image will be shown. you can customise the newHvariable to get the desired output

    if you want to change the params like a fixed width then change it in the newH variable in getImageHeight() method. eg: var newH = (messagesTV.frame.size.width * 0.6) / aspect I will get height with aspect based on the width I mentioned here in this example, my fixed width is 60% width of the screen. hope this helps!

提交回复
热议问题