मेरे पास एक कस्टम सेल है जो ऐप पर पोस्ट किए गए उपयोगकर्ताओं के साथ तालिका दृश्य को पॉप्युलेट करता है। उपयोगकर्ता एक uiimage के साथ एक पाठ संदेश या एक पाठ संदेश पोस्ट कर सकता है।

मेरे पास प्रारंभिक समस्या सेल की ऊंचाई निर्धारित करने में थी जब मेरे पास एक चित्र था। मैं हास्यास्पद ऊंचाई के साथ टेबलव्यू कोशिकाओं की छवि पाप कर रहा था और छवियां सही ढंग से लोड नहीं हो रही थीं।

इसलिए मैंने छवियों के फ्रेम को बदलने के लिए तालिका दृश्य CellforRowAt फ़ंक्शन में नीचे दिए गए कोड को जोड़ा ताकि UIImages एक समान आकार में लोड हो जाएं। हालांकि यह अब पूरी तरह से काम कर रहा है, जब मैं टेबलव्यू पर स्क्रॉल करता हूं तो यह सुपर गड़बड़ और धीमा होता है। मुझे लगता है कि फ्रेम में बदलाव के कारण इसकी वजह है और इस नए फ्रेम को प्रोसेस करने में कुछ समय लगता है। क्या इसे और अधिक कुशल और सुगम बनाना संभव है?

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
       if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
            cell.set(post: posts[indexPath.row])
            cell.delegate = self
            cell.commentDelegate = self
            cell.likeDelegate = self
            cell.selectionStyle = .none
            let imageIndex = posts[indexPath.row].mediaURL
            let url = NSURL(string: imageIndex)! as URL
            if let imageData: NSData = NSData(contentsOf: url) {
               let image = UIImage(data: imageData as Data)
                let newWidth = cell.MediaPhoto.frame.width
                let scale = newWidth/image!.size.width
                let newHeight = image!.size.height * scale
                UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
                image!.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
                    let newImage = UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()
                    cell.MediaPhoto.image = newImage
                cell.MediaPhoto.contentMode = .scaleToFill
                cell.MediaPhoto.clipsToBounds = true
            }
        }
        return cell
        
    }
1
CodingForFun333 25 अगस्त 2021, 20:42

2 जवाब

सबसे बढ़िया उत्तर

मैंने इस कोड का उपयोग करके छवि का आकार 400 x 400 तय किया और इसने बहुत अच्छा काम किया। यह अब धीरे-धीरे या गड़बड़ नहीं करता है।

func set(post:Posts) {
    
    self.post = post
    
    // get PROFILE image
    let url = post.url
    profileImageView.sd_setImage(with: url, completed: nil)
    
    // get MEDIA image
    let mediaString = post.urlM.absoluteString
    if mediaString == "none" {
        MediaPhoto.image = nil
    } else {
        let mediaUrl = post.urlM
        MediaPhoto.sd_setImage(with: mediaUrl, completed: nil)
        
        //RESIZE MEDIA PHOTO
        let itemSize:CGSize = CGSize(width: 400, height: 400)
        UIGraphicsBeginImageContextWithOptions(itemSize, false, UIScreen.main.scale)
        let imageRect : CGRect = CGRect(x: 0, y: 0, width: itemSize.width, height: itemSize.height)
        MediaPhoto!.image?.draw(in: imageRect)
        MediaPhoto!.image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    }
}
0
CodingForFun333 4 सितंबर 2021, 16:27

काम को मुख्य धागे से बाहर ले जाने का प्रयास करें।

     class PostTableViewCell: UITableViewCell {

var image: UIImage? {
    didSet {
        setNeedsDisplay()
    }
}
func set(post: Post) {

        DispatchQueue.global().async { [weak self] in
            let strongSelf = self!
            if let url = NSURL(string: strongSelf.mediaUrl) as URL?,
                let imageData: NSData = NSData(contentsOf: url) {
                
                strongSelf.image = UIImage(data: imageData as Data)
               
            
        }
    }
}

override func draw(_ rect: CGRect) {
    guard let image = image else { super.draw(rect) }
    let newWidth = MediaPhoto.frame.width
    let scale = newWidth/image.size.width
    let newHeight = image.size.height * scale
    
    UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
    image!.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
   
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    MediaPhoto.image = newImage
    MediaPhoto.contentMode = .scaleToFill
    MediaPhoto.clipsToBounds = true
}

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell

if indexPath.section == 0 {
    cell.set(post: posts[indexPath.row])
    cell.delegate = self
    cell.commentDelegate = self
    cell.likeDelegate = self
    cell.selectionStyle = .none
}
return cell

}

0
SeaSpell 28 अगस्त 2021, 22:44