ios - FlowLayout के साथ UICollectionView की ऊंचाई निर्धारित करने के लिए कैसे करें




height autolayout (6)

@ User1046037 का स्विफ्ट संस्करण:

public class DynamicCollectionView: UICollectionView {

    override public func layoutSubviews() {
        super.layoutSubviews()
        if !bounds.size.equalTo(intrinsicContentSize) {
            invalidateIntrinsicContentSize()
        }
    }

    override public var intrinsicContentSize: CGSize {
        let intrinsicContentSize: CGSize = contentSize
        return intrinsicContentSize
    }
}

मुझे UICollectionView साथ एक UICollectionViewFlowLayout मिला है, और मैं इसके सामग्री आकार की गणना करना चाहता UICollectionViewFlowLayout ( UICollectionViewFlowLayout माध्यम से अपनी ऊंचाई समायोजित करने के लिए आवश्यक intrinsicContentSize सामग्री में वापसी के लिए)।

समस्या यह है: यहां तक ​​कि यदि मेरे पास सभी कोशिकाओं के लिए एक निश्चित और समान ऊंचाई है, तो मुझे नहीं पता कि UICollectionView में मेरे पास कितनी "पंक्तियां" रेखाएं हैं I मैं यह भी निर्धारित नहीं कर सकता कि मेरे डेटा स्रोत में आइटम्स की संख्या से गिनती है, क्योंकि डेटा आइटम्स का प्रतिनिधित्व करने वाली कोशिकाएं चौड़ाई में भिन्न होती हैं, इसलिए परिणामस्वरूप UICollectionView की एक पंक्ति में मेरे पास मौजूद वस्तुओं की संख्या UICollectionView

चूंकि मुझे इस विषय पर आधिकारिक दस्तावेज में कोई संकेत नहीं मिला और गुगलिंग ने मुझे और आगे नहीं लाया, किसी भी मदद और विचारों की बहुत सराहना की जाएगी।


इस सवाल का जवाब देने में बहुत देर हो चुकी है लेकिन मैंने हाल ही में इस मुद्दे से गुजर लिया है।
@ ली के उपरोक्त उत्तर में मेरा जवाब पाने में बहुत मदद मिली है। लेकिन वह जवाब उद्देश्य-सी तक ही सीमित है और मैं तेजी से काम कर रहा था।
@lee आपके उत्तर के संदर्भ में, मुझे तेजी से उपयोगकर्ता को यह समस्या आसानी से सुलझाने दें। इसके लिए, कृपया नीचे दिए गए चरणों का पालन करें:

घोषणा अनुभाग में एक CGFloat चर घोषित करें:

var height : CGFloat!

viewDidAppear आप इसे प्राप्त कर सकते हैं:

height = self.myCollectionView.collectionViewLayout.collectionViewContentSize().height

हो सकता है कि जब आप डेटा को फिर से reload करते हैं तो नए डेटा के साथ एक नई ऊंचाई की गणना करने की आवश्यकता होती है, तो आप इसे प्राप्त कर सकते हैं: addObserver सुनने के लिए जब आपका CollectionView addObserver पर पुनः लोड डेटा समाप्त होता है addObserver :

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(true)
        ....
        ....
        self.shapeCollectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.Old, context: nil)
    }

फिर collectionview समाप्ति के बाद नई ऊंचाई प्राप्त करने या कुछ भी करने के लिए बोले फ़ंक्शन जोड़ें:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        let newHeight : CGFloat = self.myCollectionView.collectionViewLayout.collectionViewContentSize().height

        var frame : CGRect! = self.myCollectionView.frame
        frame.size.height = newHeight

        self.myCollectionView.frame = frame
    }

और पर्यवेक्षक को हटाने के लिए मत भूलना:

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(true)
    ....
    ....
    self.myCollectionView.removeObserver(self, forKeyPath: "contentSize")
}

मुझे उम्मीद है कि यह आपको तेजी से अपने मुद्दे को हल करने में मदद करेगा।


यदि आप ऑटो लेआउट का उपयोग कर रहे हैं, तो आप UICollectionView उप-वर्ग बना सकते हैं

यदि आप नीचे दिए गए कोड का उपयोग करते हैं तो आपको संग्रह दृश्य के लिए कोई भी ऊंचाई बाधा निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि यह संग्रह दृश्य की सामग्री के आधार पर अलग-अलग होगा।

नीचे दिया गया कार्यान्वयन है:

@interface DynamicCollectionView : UICollectionView

@end

@implementation DynamicCollectionView

- (void) layoutSubviews
{
    [super layoutSubviews];

    if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize]))
    {
        [self invalidateIntrinsicContentSize];
    }
}

- (CGSize)intrinsicContentSize
{
    CGSize intrinsicContentSize = self.contentSize;

    return intrinsicContentSize;
}

@end

वाह! कुछ कारणों से, शोध के घंटों के बाद, अब मुझे अपने प्रश्न का एक बहुत ही आसान जवाब मिला: मैं पूरी तरह गलत जगह पर खोज कर रहा था, जो UICollectionView पर UICollectionView सभी दस्तावेजों के माध्यम से खोद रहा था।

सरल और आसान समाधान अंतर्निहित लेआउट में निहित है: बस अपने myCollectionView.collectionViewLayout प्रॉपर्टी पर collectionViewContentSize myCollectionView.collectionViewLayout पर कॉल करें और आपको CGSize रूप में सामग्री की ऊंचाई और चौड़ाई CGSize । यह उतना आसान है जितना।


स्विफ्ट में उपयोगकर्ता 1046037 उत्तर ...

class DynamicCollectionView: UICollectionView {
    override func layoutSubviews() {
        super.layoutSubviews()
        if bounds.size != intrinsicContentSize() {
            invalidateIntrinsicContentSize()
        }
    }

    override func intrinsicContentSize() -> CGSize {
        return self.contentSize
    }
}

viewDidAppear आप इसे प्राप्त कर सकते हैं:

float height = self.myCollectionView.collectionViewLayout.collectionViewContentSize.height;

हो सकता है कि जब आप डेटा को फिर से लोड करते हैं तो नए डेटा के साथ एक नई ऊंचाई की गणना करने की आवश्यकता होती है, तो आप इसे प्राप्त कर सकते हैं: सुनने के लिए पर्यवेक्षक जोड़ें जब आपका CollectionView viewdidload लोड पर डेटा पुनः लोड कर viewdidload :

[self.myCollectionView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionOld context:NULL];

फिर संग्रह की समाप्ति के बाद नई ऊंचाई प्राप्त करने या कुछ भी करने के लिए बोले फ़ंक्शन जोड़ें:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary  *)change context:(void *)context
{
    //Whatever you do here when the reloadData finished
    float newHeight = self.myCollectionView.collectionViewLayout.collectionViewContentSize.height;    
}

और पर्यवेक्षक को हटाने के लिए मत भूलना:

[self.myCollectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];




autolayout