2015-04-13 9 views
9

का उपयोग कर तालिका दृश्य कक्ष के भीतर सभी कक्षों को फिट करने के लिए संग्रह दृश्य ऊंचाई अपडेट करें। मैं UITableViewCell के भीतर UICollectionView को गतिशील का लाभ उठाना चाहता हूं। मैं यह सुनिश्चित करना चाहता हूं कि संग्रह दृश्य में सभी कक्ष स्क्रीन पर दिखाई दे रहे हैं, इसलिए संग्रह कक्ष फिट करने के लिए तालिका कक्ष ऊंचाई में बढ़ना चाहिए। मैं लगभग यह काम कर रहा हूँ। मैं टेबल टेबल को सही आकार के रूप में प्राप्त करने में सक्षम नहीं हूं - यह ऊंचाई में बहुत लंबा या बहुत छोटा है, और कुछ लेआउट समस्या तब तक दिखाई दे रही हैं जब तक कि मैं तालिका से बातचीत नहीं करता (नीचे उस पर अधिक)।स्वत: लेआउट

मैंने तालिका के सेल के contentView पर संग्रह दृश्य के लिए ऑटो लेआउट बाधाएं सेट की हैं: अग्रणी, पीछे, ऊपर और नीचे। इसके बाद मैंने संग्रह दृश्य पर ऊंचाई बाधा उत्पन्न की ताकि मैं संग्रह दृश्य में सभी कक्षों को फिट करने के लिए उचित ऊंचाई की गणना करने के बाद फ्लाई पर constant अपडेट कर सकूं (क्योंकि मुझे नहीं लगता कि स्वचालित रूप से ऐसा करने का कोई तरीका है)।

यहां बाकी सेटअप है।

viewDidLoad { 
    self.tableView.rowHeight = UITableViewAutomaticDimension 
    self.tableView.estimatedRowHeight = 44 
} 

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    let cellDimension = self.collectionView.frame.size.width/7 //always 7 columns 

    let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout 
    flowLayout.itemSize = CGSizeMake(cellDimension, cellDimension) 

    self.collectionViewHeightConstraint.constant = cellDimension * 4 //always 4 rows 
} 

मैं heightForRowAtIndexPath लागू नहीं किया है।

यह सेटअप विरोधाभासी लंबवत बाधाओं में परिणाम देता है। मैंने बाधाओं की प्राथमिकता को कम करने और संयोजनों के समूह में संबंध बदलने की कोशिश की है, लेकिन कोई भी वांछित व्यवहार में नहीं हुआ। यदि मैं 999 तक ऊंचाई की बाधा की प्राथमिकता को कम करता हूं, तो टेबल व्यू सेल पहले बहुत लंबा होता है, लेकिन तालिका के ऊपर और नीचे स्क्रॉल करने के बाद तालिका की ऊंचाई ऊंचाई की अपेक्षा की जाती है। कुछ अन्य संयोजनों के साथ, परिणाम या तो तालिका कक्ष बहुत छोटा है, फिर भी पूर्ण संग्रह दृश्य खून बह रहा है, तालिका कक्ष बहुत छोटा है और संग्रह दृश्य काट दिया गया है, या तालिका कक्ष बहुत लंबा है, जो प्राथमिकता के आधार पर है और संबंध मैंने बाधाओं पर लागू किया है। इसके अतिरिक्त, संग्रह दृश्य कक्ष उचित आकार पर प्रदर्शित नहीं होते हैं जबकि दृश्य एनिमेटिंग होता है (लेकिन वे एनीमेशन खत्म होने के समय ठीक से समायोजित होते हैं), या यदि मैं तालिका को फिर से लोड करता हूं तो संग्रह दृश्य कक्ष गलत आकार के होते हैं जब तक मैं स्क्रॉल नहीं करता टेबल।

गतिशील तालिका दृश्य सेल ऊंचाई प्राप्त करने के लिए मैं इन उपस्थिति समस्याओं को कैसे हल कर सकता हूं जिसमें डिस्प्ले की चौड़ाई के आधार पर गतिशील सेल आकार वाली एक पूरी तरह से दृश्य संग्रह दृश्य शामिल है?

+0

मैं पंक्ति को स्थानांतरित करने का सुझाव दूंगा "guarant.tidView.rowHeight =" ViewDidLoad से ViewWillAppear के बजाय, आप यह प्रश्न भी देखना चाहेंगे। [लिंक] (http://stackoverflow.com/questions/29263875/uitableviewcells-initial-load-view-display-issue) –

+0

@ केविन हॉर्गन ने कोई ध्यान देने योग्य अंतर नहीं बनाया। – Joey

+0

UITableViewCell में ऑटोलायआउट सही तरीके से काम करने के लिए आपको कंटेनर व्यू में सभी लेआउट के लिए बाधाओं को जोड़ने के बिना बाधाओं को जोड़ने की आवश्यकता है। अन्यथा ऑटोलायआउट ठीक से काम नहीं करेगा। निम्न लिंक जांचें जो tableviewcell http: // stackoverflow के लिए autolayout सेटअप की कुछ विस्तृत जानकारी देता है .com/प्रश्न/2 9 2313 9 0/यूटेबलव्यू-अजीब-लेआउट-व्यवहार-परिवर्तन-ऑन-स्क्रॉल/2 9 327082 # 2 9 327082 – Ram

उत्तर

0

यहां मैं इस बात से कैसे संपर्क करूंगा, और मुझे लगता है कि यह सब आईबी में किया जा सकता है।

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

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

0

कैसे forkingdog आप uicollectionview के लिए imageView बाहर स्विच करने में सक्षम होना चाहिए tableview कोशिकाओं यहाँ> https://github.com/forkingdog/UITableView-FDTemplateLayoutCell

के गतिशील हाइट्स के एक ही समस्या को हल किया है पर एक नज़र डालें। enter image description here

अपने tableview में - बल्कि बॉक्स अनुमान पंक्ति की ऊँचाई से बाहर का उपयोग करने से - आप की तरह

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [tableView fd_heightForCellWithIdentifier:@"FDFeedCell" configuration:^(FDFeedCell *cell) { 
     cell.entity = self.feedEntities[indexPath.row]; 
    }]; 
} 



#import "UITableView+FDTemplateLayoutCell.h" 
#import <objc/runtime.h> 

@implementation UITableView (FDTemplateLayoutCell) 

- (id)fd_templateCellForReuseIdentifier:(NSString *)identifier; 
{ 
    NSAssert(identifier.length > 0, @"Expects a valid identifier - %@", identifier); 

    NSMutableDictionary *templateCellsByIdentifiers = objc_getAssociatedObject(self, _cmd); 
    if (!templateCellsByIdentifiers) { 
     templateCellsByIdentifiers = @{}.mutableCopy; 
     objc_setAssociatedObject(self, _cmd, templateCellsByIdentifiers, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 

    UITableViewCell *templateCell = templateCellsByIdentifiers[identifier]; 
    if (!templateCell) { 
     templateCell = [self dequeueReusableCellWithIdentifier:identifier]; 
     templateCellsByIdentifiers[identifier] = templateCell; 
    } 

    return templateCell; 
} 

- (CGFloat)fd_heightForCellWithIdentifier:(NSString *)identifier configuration:(void (^)(id))configuration 
{ 
    // Fetch a cached template cell for `identifier`. 
    UITableViewCell *cell = [self fd_templateCellForReuseIdentifier:identifier]; 

    // Reset to initial height as first created, otherwise the cell's height wouldn't retract if it 
    // had larger height before it gets reused. 
    cell.contentView.bounds = CGRectMake(0, 0, CGRectGetWidth(self.frame), self.rowHeight); 

    // Manually calls to ensure consistent behavior with actual cells (that are displayed on screen). 
    [cell prepareForReuse]; 

    // Customize and provide content for our template cell. 
    if (configuration) { 
     configuration(cell); 
    } 

    // Add a hard width constraint to make dynamic content views (like labels) expand vertically instead 
    // of growing horizontally, in a flow-layout manner. 
    NSLayoutConstraint *tempWidthConstraint = 
    [NSLayoutConstraint constraintWithItem:cell.contentView 
           attribute:NSLayoutAttributeWidth 
           relatedBy:NSLayoutRelationEqual 
            toItem:nil 
           attribute:NSLayoutAttributeNotAnAttribute 
           multiplier:1.0 
            constant:CGRectGetWidth(self.frame)]; 
    [cell.contentView addConstraint:tempWidthConstraint]; 

    // Auto layout does its math 
    CGSize fittingSize = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

    [cell.contentView removeConstraint:tempWidthConstraint]; 

    // Add 1px extra space for separator line if needed, simulating default UITableViewCell. 
    if (self.separatorStyle != UITableViewCellSeparatorStyleNone) { 
     fittingSize.height += 1.0/[UIScreen mainScreen].scale; 
    } 

    return fittingSize.height; 
} 

@end 
1

कुछ मैं क्या collectionView कोशिकाओं की स्थापना में आप कोड से समझ सकता हूँ से की आवश्यकता होगी और आकार, ऐसा लगता है कि आप स्क्वायर संग्रह कक्ष चाहते हैं, और 7 कोशिकाओं की 4 पंक्तियां हैं और सभी पूरी तरह से दिखाई दे रही हैं।

यदि आप संग्रह में बाधाएं जोड़ते हैं जो कि सभी 4 मार्जिन (शीर्ष, नीचे, बाएं और दाएं) के लिए सेल में है और फिर संग्रह दृश्य में 7: 4 के एक पहलू अनुपात की बाधा जोड़ें, तो तालिकादृश्य सक्षम होना चाहिए सही आकार पर आपके लिए स्वचालित रूप से सेल ऊंचाई की गणना करें।

+0

देखें यह परिणाम विरोधाभासी बाधाओं में हैं। मुझे सभी उपलब्ध स्थान भरने के लिए समायोजित करने के लिए वस्तुओं की भी आवश्यकता है - प्रत्येक सेल के बीच कोई अंतर नहीं होना चाहिए। – Joey

+0

विरोधाभासी बाधाओं से छुटकारा पाने के लिए आपको तालिका को सेल दृश्य के अनुसार सेट करना होगा। जब आप इसे चलाते हैं तो तालिका दृश्य सही आकार का आकार देगा, लेकिन आईबी में आपको इसे करना होगा। 7: 4 अनुपात का उपयोग करके गणना करना मुश्किल नहीं होना चाहिए। आइटम्स को संग्रह दृश्य के लिए आइटम आकार सेट करने के लिए आवश्यक सभी उपलब्ध स्थान भरने के लिए। लेकिन ध्यान दें, आपके पास प्रत्येक संग्रह में एक संग्रह दृश्य है, इसलिए आपको इसे तालिका दृश्यों में से किसी एक में सेट करना होगा। – pteofil

+0

हालांकि, मुझे यह सोचने के बाद कि आप संग्रह के साथ प्राप्त करने का प्रयास कर रहे हैं, तालिकादृश्य कक्षों में एम्बेडेड दृश्य, केवल एक संग्रह दृश्य के साथ पूरा किया जा सकता है और आप प्रत्येक तालिका में जो कुछ भी डाल रहे थे, वह दृश्य कक्ष जिसे आपने संग्रह दृश्य में अनुभागों में रखा है। – pteofil