2015-05-12 8 views
7

स्टोरीबोर्ड और ऑटोलायआउट का उपयोग करके, मेरे पास UISCrollView के साथ मुख्य दृश्य के रूप में UIViewController है। मेरे पास स्क्रॉल व्यू में एम्बेडेड कई कंटेनर दृश्य हैं। उन एम्बेडेड कंटेनर दृश्यों में से कुछ में UITableViews होते हैं, जिनमें से प्रत्येक में विभिन्न ऊंचाइयों की कोशिकाएं होती हैं। मुझे तालिका दृश्य की आवश्यकता होगी ताकि सभी कक्षों को एक साथ में दिखाने के लिए पर्याप्त हो, क्योंकि तालिका दृश्य पर स्क्रॉलिंग अक्षम कर दी जाएगी।कंटेनर व्यू की ऊंचाई समायोजित करने के लिए एम्बेडेड UITableView

मुख्य UIViewController में, स्क्रॉल व्यू को ठीक से काम करने के लिए कंटेनर व्यू की ऊंचाई को परिभाषित किया जाना चाहिए। यह समस्याग्रस्त है क्योंकि मेरे पास यह जानने का कोई तरीका नहीं है कि मेरी तालिका कितनी बड़ी होगी, एक बार यह अलग-अलग ऊंचाई की कोशिकाएं पूरी हो जाती हैं। मैं अपने गैर-स्क्रॉलिंग UITableView फिट करने के लिए रनटाइम पर अपने कंटेनर व्यू की ऊंचाई को कैसे समायोजित कर सकता हूं?

अब तक, मैं निम्नलिखित किया है:

// in embedded UITableViewController 
// 
- (void)viewDidLoad { 
    // force layout early so I can determine my table's height 
    [self.tableView layoutIfNeeded]; 

    if (self.detailsDelegate) { 
     [self.detailsTableDelegate didDetermineHeightForDetailsTableView:self.tableView]; 
    } 
} 

// in my main UIViewController 
// I have an IBOutlet to a height constraint set up on my container view 
// this initial height constraint is just temporary, and will be overridden 
// once this delegate method is called 
- (void)didDetermineHeightForDetailsTableView:(UITableView *)tableView 
{ 
    self.detailsContainerHeightConstraint.constant = tableView.contentSize.height; 
} 

यह ठीक काम कर रहा है और मैं परिणाम से खुश था। हालांकि, मेरे पास जोड़ने के लिए एक या दो कंटेनर दृश्य हैं, जिनमें गैर-स्क्रॉलिंग तालिका दृश्य होंगे, और मुझे प्रत्येक कंटेनर व्यू के लिए एक नया प्रतिनिधि प्रोटोकॉल बनाना नफरत है। मुझे नहीं लगता कि मैं जेनेरिक प्रोटोकॉल कर सकता हूं।

कोई विचार?

+0

मुझे एक समान समस्या का सामना करना पड़ रहा है। क्या आपको इसके लिए समाधान मिला? – ntsh

+0

@ntsh मैंने अभी अपना जवाब जोड़ा है। एक नज़र डालें और देखें कि क्या यह आपको – djibouti33

+0

धन्यवाद देता है। मैं भी tableView की सामग्री आकार का उपयोग करके एक समान समाधान के साथ समाप्त हुआ। – ntsh

उत्तर

1

यहाँ मैं क्या कर समाप्त हो गया है:

// In my embedded UITableViewController: 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tableView.rowHeight = UITableViewAutomaticDimension; 
    self.tableView.estimatedRowHeight = 60.0; 

    // via storyboards, this viewController has been embeded in a containerView, which is 
    // in a scrollView, which demands a height constraint. some rows from our static tableView 
    // might not display (for lack of data), so we need to send our table's height. we'll force 
    // layout early so we can get our size, and then pass it up to our delegate so it can set 
    // the containerView's heightConstraint. 
    [self.tableView layoutIfNeeded]; 

    self.sizeForEmbeddingInContainerView = self.tableView.contentSize; 
} 

// in another embedded view controller:  
- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    self.sizeForEmbeddingInContainerView = self.tableView.contentSize; 
} 

// then, in the parent view controller, I do this: 
// 1) ensure each container view in the storyboard has an outlet to a height constraint 
// 2) add this: 
- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    self.placeDetailsContainerHeightConstraint.constant = self.placeDetailsTableViewController.sizeForEmbeddingInContainerView.height; 
    self.secondaryExperiencesContainerHeightConstraint.constant = self.secondaryExperiencesViewController.sizeForEmbeddingInContainerView.height; 
} 

मैं अभी तक यह नहीं किया है, लेकिन यह शायद CGSize sizeForEmbeddingInContainerView की संपत्ति है कि प्रत्येक बच्चे को देखने के नियंत्रक गोद ले सकते हैं के साथ एक प्रोटोकॉल बनाने के लिए सबसे अच्छा होगा।

+0

क्या आपने इसे कार्यान्वित किया है यह काम कर रहा है @ djibouti33 –

+0

मेरा मानना ​​है कि मैं इसके बजाय प्रोटोकॉल बनाने के समाप्त हो गया। – djibouti33

1

यहां मेरे लिए पूरी तरह से काम किया गया है।

- (void)updateSizeBasedOnChildViews { 

    // Set height of container to match embedded tableview 
    CGRect containerFrame = self.cardTableContainer.frame; 
    containerFrame.size.height = [[[self.cardTableContainer subviews] lastObject]contentSize].height; 
    self.cardTableContainer.frame = containerFrame; 

    // Set content height of scrollview according to container 
    CGRect scrollFrame = self.cardTabScrollView.frame; 
    scrollFrame.size.height = containerFrame.origin.y + containerFrame.size.height; 
      // + height of any other subviews below the container 
    self.cardTabScrollView.contentSize = scrollFrame.size; 
} 
+0

आपने यह कॉल कहां रखा - कौन सी विधि? मेरी समस्या यह है कि मैं MOWToParentViewController के बाद यह करने का प्रयास करता हूं और नियंत्रक अभी तक लोड नहीं होता है, लेकिन मैं यह नहीं समझ सकता कि कंटेनर व्यू कंट्रोलर को बच्चे को लोड होने पर कैसे पता चलेगा। – SAHM

+0

@SAHM मेरे मामले में, मैंने tableViewController के लिए डेटा सेट करने के बाद इसे कॉल किया (जो [tableView reloadData] को कॉल करता है)। हालांकि यह 2 साल पहले से अधिक था, इसलिए सटीक विवरण याद नहीं है। मेरा अंतिम कोड था: देखने में डीडएपियर: '' '[स्वयं अपडेटChildViewData]' '' और फिर '' '- (शून्य) अद्यतनChildViewData {[स्वयं अद्यतनChildTableVCData]; [स्वयं अद्यतन आकार BasedTnVildViews]}' '' – ntsh

संबंधित मुद्दे