2010-01-21 19 views
8

प्रदर्शित करने के लिए अपने सबव्यूव की चौड़ाई को ऑटोरेज़िज़ कर सकता है मेरे पास NSCollectionView है जिसमें CustomViews का संग्रह शामिल है। शुरुआत में यह सबव्यूम्स को कॉलम और पंक्तियों में ग्रिड की तरह टाइल करता था। इसके बाद मैंने Columns संपत्ति को आईबी में 1 में सेट किया है, इसलिए अब यह पंक्तियों में किसी एक के बाद उन्हें प्रदर्शित करता है। हालांकि, भले ही मेरा CustomView 400px चौड़ा है, फिर भी यह ऑटोरेसाइज करने के लिए सेट है, NSCollectionView 400px चौड़ा है, और यह 1 कॉलम पर सेट है, सबव्यूज़ लगभग 80px चौड़े हैं।एनएससीओलेक्शन व्यू एक कॉलम

मैं जानता हूँ कि मैं इस के आसपास फोन करके प्राप्त कर सकते हैं:

CGFloat width = collectionView.bounds.size.width; 
NSSize size = NSMakeSize(width, 85); 
[collectionView setMinItemSize:size]; 
[collectionView setMaxItemSize:size]; 

लेकिन मेरे WindowController की awakeFromNib विधि में इस कोड डाल केवल सही चौड़ाई सेट किए जाने पर कार्यक्रम की शुरूआत। जब मैं खिड़की का आकार बदलता हूं (और NSCollectionView जैसा कि मैंने निर्दिष्ट किया है, तो ऑटोरेसाइज़ करता है), कस्टम व्यू अपनी प्रारंभिक सेट चौड़ाई पर रहते हैं।

मुझे आवश्यकता होने पर सबव्यूज़ का आकार बदलने का ख्याल रखने में खुशी है, लेकिन मैं कोको के लिए काफी नया हूं और ऐसा कोई लेख नहीं दिख रहा है कि इस तरह की चीज कैसे करें। क्या कोई मुझे सही दिशा दिखा सकता है?

एंथोनी

+0

अब है कि खोज की है मैं अपने विंडो नियंत्रक को विंडो के प्रतिनिधि बनने के लिए सेट कर सकता हूं और windowDidResize के माध्यम से आकार बदलना नोटिफिकेशन प्राप्त कर सकता हूं। तो अब मैक्स और न्यूनतम आइटम आकार सेट करने के लिए विंडो का आकार बदलने पर प्रत्येक बार उपरोक्त कोड का उपयोग कर रहा हूं। खिड़की बढ़ने के साथ यह ठीक काम करता है, लेकिन किसी कारण से न्यूनतम/अधिकतम आइटम आकार में वृद्धि के कारण संग्रह दृश्य की सीमाएं कभी भी कम नहीं होतीं, यहां तक ​​कि खिड़की करता है। तो भले ही संग्रह दृश्य दृश्यमान रूप से घटता है क्योंकि मैं खिड़की का आकार बदलता हूं, यह सीमाएं कभी नहीं होती हैं, और मेरे सबव्यू के लिए भी नहीं! – littlecharva

+0

क्या आपने कभी इसे स्वचालित रूप से करने का कोई तरीका खोजा है? – tofutim

उत्तर

-2

मैट Gallagher के अद्भुत ब्लॉग Cocoa with Loveके बारे में इसका पता लगाने के लिए है। इस हफ्ते, वह प्रश्न में से एक की तरह एक एक स्तंभ दृश्य की बाइंडिंग विवरण साझा:

http://cocoawithlove.com/2010/03/designing-view-with-bindings.html

अगला प्रविष्टि, वह कार्यान्वयन के बाकी साझा करने के लिए है, जो आप देना चाहिए कि तुम क्या कर रहे हैं का वादा किया खोज रहे हैं

(मैं नोट करना चाहिए कि वह NSView सीधे उपवर्गीकरण है और फिर से लागू करने NSCollectionView की सुविधाओं में से कई इस हालांकि आम हो रहा है; नहीं कई लोगों को NSCollectionView उपवर्गीकरण के शौकीन हैं।।)

संपादित करें: वह लगता है अपना वादा तोड़ा ... हम उस पद को कभी नहीं मिला। इसके बजाय टोफुटिम का उत्तर देखें।

3

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

CGFloat width = collectionView.enclosingScrollView.bounds.size.width; 
+0

चौड़ाई सेट कहां है? – tofutim

+0

मैंने इसे जागने के साथ सेट करने की कोशिश की - लगभग 60% समय, यह काम करता है - लेकिन आश्चर्यजनक रूप से अन्य 40% में संलग्न है जिसमें स्क्रॉल व्यू 0 चौड़ाई है। मुझे लगता है कि एक्सकोड किसी तरह से कुछ कैशिंग कर रहा है और यह ठीक से निर्माण किए बिना निब को बहाल कर देता है। – tofutim

9

सही जवाब 0,0 (NSZeroSize) को maxItemSize स्थापित करने के लिए है। अन्यथा, यह गणना की जाती है।

[self.collectionView setMaxItemSize:NSZeroSize]; 

इसे awakeFromNib में सेट किया जा सकता है।

+0

यह इतना आसान है और यह वही करता है जो मुझे चाहिए था। मेरे संग्रह दृश्य में आइटम अब संग्रह दृश्य के साथ आकार बदलते हैं जैसे मैं इरादा कर रहा था। – Chris

1

एक और देर से - मैंने बस NSTableView का उपयोग करने के लिए स्विच किया और delegate विधि द्वारा NSView प्रदान किया।

ऑटोरेसाइजिंग मुफ्त में आता है, एक कॉलम आसान है, और यह बड़े पैमाने पर तेज़ी से प्रस्तुत करता है।

0

चलें कहते हैं कि तुम चाहते 200x180px के आकार के साथ अपने CollectionViewItem, तो आप स्थापित करना चाहिए:

[myCollectionView setMinItemSize:NSMakeSize(200, 180)]; 
[myCollectionView setMaxItemSize:NSMakeSize(280, 250)]; 

आपका अधिकतम आकार काफी बड़ा अच्छे लग रहे हैं और collectionView- फिट करने के लिए खींच लिए पर्याप्त जगह देने के लिए किया जाना चाहिए चौड़ाई।

यदि आपके पास निश्चित संख्या में कॉलम हैं, तो आप शायद (0,0) का उपयोग कर सकते हैं, लेकिन यदि आप पंक्तियों और स्तंभों की गतिशील संख्या चाहते हैं जैसे कि मैं चाहता हूं .. आपको एक निश्चित न्यूनतम आकार और एक बड़ा सेट करना चाहिए अधिकतम आकार।

0

के रूप में आप चाहते हैं आप एक संग्रह दृश्य व्यवहार करने के लिए मिल सकता है, मुझे लगता है कि आप एक डिजाइन समस्या

है, तो आप NSTableView का उपयोग करें और 1 के लिए कॉलम और कुछ भी लेकिन "कोई नहीं" के लिए उनके आकार निर्धारित करना चाहिए। NSTableView टैब्यूलर डेटा के लिए है, इसके अलावा यह कोशिकाओं को रीसायकल कर सकता है जो बड़ी मात्रा में वस्तुओं के लिए एक अच्छा प्रदर्शन बढ़ावा देता है। NSCollectionView एक रैखिक लेआउट की तरह है जो वर्टिकल स्क्रॉलिंग के साथ ग्रिड में आइटम व्यवस्थित करता है। यह तब उपयोगी होता है जब कॉलम संख्या गतिशील रूप से स्क्रीन पर अधिक आइटम दिखाने की अनुमति देती है, आमतौर पर डिवाइस अभिविन्यास और स्क्रीन आकार के आधार पर।

2

मैं इस एक डिफ़ॉल्ट लेआउट के साथ काम करने के लिए नहीं मिल सका - लेकिन यह एक कस्टम लेआउट लागू करने के लिए काफी आसान है:

/// Simple single column layout, assuming only one section 
class SingleColumnLayout: NSCollectionViewLayout { 

    /// Height of each view in the collection 
    var height:CGFloat = 100 

    /// Padding is wrapped round each item, with double an extra bottom padding above the top item, and an extra top padding beneath the bottom 
    var padding = EdgeInsets.init(top: 5, left: 10, bottom: 5, right: 10) 

    var itemCount:Int { 
     guard let collectionView = collectionView else { 
      return 0 
     } 

     return collectionView.numberOfItems(inSection:0) 
    } 

    override func shouldInvalidateLayout(forBoundsChange newBounds: NSRect) -> Bool { 
     return true 
    } 

    override open func layoutAttributesForItem(at indexPath: IndexPath) -> NSCollectionViewLayoutAttributes? { 
     let attributes = NSCollectionViewLayoutAttributes(forItemWith: indexPath) 
     guard let collectionView = collectionView else { 
      return attributes 
     } 

     let bounds = collectionView.bounds 
     let itemHeightWithPadding = height + padding.top + padding.bottom 
     let row = indexPath.item 

     attributes.frame = NSRect(x: padding.left, y: itemHeightWithPadding * CGFloat(row) + padding.top + padding.bottom , width: bounds.width - padding.left - padding.right , height: height) 
     attributes.zIndex = row 

     return attributes 
    } 

    //If you have lots of items, then you should probably do a 'proper' implementation here 
    override open func layoutAttributesForElements(in rect: NSRect) -> [NSCollectionViewLayoutAttributes] { 
     var attributes = [NSCollectionViewLayoutAttributes]() 

     if (itemCount>0){ 
      for index in 0...(itemCount-1) { 
       if let attribute = layoutAttributesForItem(at: NSIndexPath(forItem: index, inSection: 0) as IndexPath) { 
        attributes.append(attribute) 
       } 
      } 
     } 

     return attributes 
    } 

    override open var collectionViewContentSize: NSSize { 

     guard let collectionView = collectionView else { 
      return NSSize.zero 
     } 

     let itemHeightWithPadding = height + padding.top + padding.bottom 

     return NSSize.init(width: collectionView.bounds.width, height: CGFloat(itemCount) * itemHeightWithPadding + padding.top + padding.bottom) 
    } 
} 

तो आप की जरूरत है सब है

var layout=SingleColumnLayout() 
collectionView.collectionViewLayout = layout 
संबंधित मुद्दे