मैं अपने टेबलव्यू सेल में फ़िट होने के लिए एकाधिक UIImageViews के साथ एक कस्टम फोटो कंटेनर प्राप्त करने का प्रयास कर रहा हूं। दृश्य में छवियों की एक चर संख्या (1 ~ 9) होती है, और इसकी ऊंचाई तदनुसार बदल जाएगी 1x से 3x छविऊंचाई।

मैंने टेबलव्यू और कस्टम UIView के साथ शीर्ष/नीचे/अग्रणी/पिछला मार्जिन को परिभाषित करने के लिए ऑटोलाउट का उपयोग किया, और स्वयं-आकार देने वाली कोशिकाओं को सक्षम करने के लिए, मैंने सेट किया है

tableView.estimatedRowHeight = X
tableView.rowHeight = UITableViewAutomaticDimension

मैं इन कोशिकाओं को के साथ प्रारंभ करता हूं

tableView.register(nib: forCellReuseIdentifier:)

और tableView(_ tableView: cellForRowAt:) विधि में, मैं सेल को इसके साथ सेटअप करता हूं:

let cell = tableView.dequeueReusableCell(
    withIdentifier: "test9cell", 
               for: indexPath) as! SocialFeedTableViewCell
cell.photoContainer.setup(with: urls)
cell.photoContainer.loadImages()
return cell 

जहां setup() प्रत्येक छवि को एक URL के साथ कंटेनर में देखें

func setup(with urls: [URL]) {
    self.imageUrls = urls
    for i in 0 ..< urls.count {
        let imageView = UIImageView(frame: CGRect.zero)
        self.addSubview(imageView)
        self.imageViews.append(imageView)
    }
    self.setNeedsLayout()
}

func loadImages() {
    self.imageViews.forEach { imageView in
        imageView.frame = // Calculate position for each subview
        imageView.sd_setImage(...) // Load web image asynchronously
    }
}

दृश्य के लिए आंतरिक सामग्री आकार को परिभाषित करना:

override var intrinsicContentSize {
    let frameWidth = self.frame.size.width
    var frameHeight: CGFloat
    switch self.imageUrls.count { // range from 1...9
    case 1...3:
        frameHeight = frameWidth / 3
    case 4...6:
        frameHeight = frameWidth / 3 * 2
    default:
        frameHeight = frameWidth
    return CGSize(frameWidth, frameHeight)
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.imageViews.forEach { imageView in
        imageView.frame = // Calculate position for each subview
    }
}

यहां समस्या यह है: प्रारंभिक आंतरिक सामग्री आकार सेट करने के बाद, कंटेनर का फ्रेम आकार लेआउटसुबव्यू() में बाद में बदल जाता है। हालांकि तब तक मैं इमेज व्यू सबव्यू को सही स्थिति में रख सकता हूं, सेल की ऊंचाई अब और नहीं बदली जाएगी।

आशा है कि मैं इस समस्या को और अधिक भ्रमित नहीं कर रहा हूँ। क्या कोई यह बता सकता है कि UIView सबव्यू की सामग्री को संशोधित करने के बाद मैं सेल ऊंचाई का आकार कैसे बदलूं? धन्यवाद!

1
F. Bai 14 जिंदा 2017, 15:03

1 उत्तर

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

यहां कुछ चीजें हैं जो आपको गतिशील रूप से आकार की कोशिकाओं के साथ कुछ समस्याएं पैदा कर रही हैं।

  1. आप सेल में कई आइटम जोड़ रहे हैं लेकिन छवि दृश्यों पर किसी भी ऑटो लेआउट बाधाओं को परिभाषित नहीं कर रहे हैं, इसलिए यह नहीं जानता कि आइटम को सही तरीके से कैसे रखा/स्टैक किया जाए।
  2. ऊपर दिए गए कोड से आप UIImageView को CGRectZero के फ्रेम के साथ जोड़ रहे हैं, बिना ऑटोलेआउट नियमों के वे या तो शून्य रहेंगे या जब आप कोई छवि जोड़ते हैं तो सामग्री को समायोजित करने का प्रयास करेंगे, लेकिन वे कोशिकाओं की ऊंचाई को समायोजित नहीं करेंगे।
  3. यदि आप नेटवर्क से छवियों को लोड कर रहे हैं तो टेबलव्यूसेल ने अपना प्रारंभिक प्रतिपादन करने के बाद उन्हें संभावित रूप से जोड़ा/प्रस्तुत किया जाएगा। तो आपको लोड की गई छवियों को कैश करने और सेल को फिर से लोड करने की आवश्यकता होगी ताकि वे सही समय पर लोड हो सकें।

अब यह अंतिम बिंदु बहुत अधिक जटिल है।

डायनामिक UITableViewCell उनके भीतर की सामग्री के ऑटोलायआउट नियमों के आधार पर उनकी ऊंचाई की गणना करता है। आपके पास अपनी सामग्री से लेकर UITableViewCell की सामग्री दृश्य संपत्ति (सभी किनारों तक) तक पर्याप्त बाधाएं होनी चाहिए जो सेल को प्रत्येक आइटम को रखने के लिए पर्याप्त जानकारी देती हैं, इसकी समग्र ऊंचाई और चौड़ाई की गणना करती हैं और इसलिए यह नई ऊंचाई की गणना करने में सक्षम है।

गतिशील आकार के सेल के लिए केवल एक छवि का उपयोग करना बहुत बुरा नहीं है। लेकिन सेल के शुरू में रेंडर होने के बाद बिना किसी नियम के कई आइटम्स को डायनेमिक रूप से रखने से काम नहीं चलेगा।

आपको यह तय करने की आवश्यकता है कि इन छवियों को आपके सेल में कैसे रखा जाना चाहिए। एक बार आपके पास यह हो जाने के बाद आप छवि दृश्य जोड़ते समय आवश्यक बाधाओं को जोड़ने पर विचार कर सकते हैं। व्यक्तिगत रूप से मैं प्रत्येक छवि प्राप्त करने के बाद केवल छवि दृश्य जोड़ूंगा।

पहले जब मैंने ऐसा किया है तो मैंने एक बार प्राप्त छवियों को कैश किया है और सेल को फिर से लोड किया है ताकि छवि को सेल में रखा जा सके क्योंकि इसे प्रस्तुत किया गया है, जिससे टेबलव्यू सेल को छवि आयामों और बाधाओं के आधार पर इसकी ऊंचाई की गणना करने की इजाजत मिलती है।

आप संग्रह दृश्य का उपयोग करने या छवियों को एक साथ एक छवि में मर्ज करने और अपने सेल में इसका उपयोग करने पर भी विचार कर सकते हैं। यदि आप छवियों तक उस तरह की पहुंच रखते हैं तो आप इसे रनटाइम या सर्वर साइड पर डिवाइस पर कर सकते हैं।

0
Scriptable 14 जिंदा 2017, 15:57