मैं पिछले 3 या 4 घंटों से इसके खिलाफ दीवार पर अपना सिर मार रहा हूं और मैं इसका पता नहीं लगा सकता। मेरे पास इसके अंदर एक पूर्ण स्क्रीन UITableView के साथ एक UIViewController है (स्क्रीन पर कुछ अन्य सामान है, यही कारण है कि मैं एक UITableViewController का उपयोग नहीं कर सकता) और मैं ऑटोलाययूट के साथ आकार बदलने के लिए अपना tableHeaderView प्राप्त करना चाहता हूं। कहने की जरूरत नहीं है, यह सहयोग नहीं कर रहा है।
नीचे स्क्रीनशॉट देखें
क्योंकि ओवरव्यूब्लाब (उदाहरण के लिए "सूची की जानकारी यहाँ देखें।" पाठ) में गतिशील सामग्री है, मैं इसे आकार देने के लिए ऑटोलॉययट का उपयोग कर रहा हूँ और यह पर्यवेक्षण है। मुझे टेबलहैदर व्यू को छोड़कर, अच्छी तरह से सब कुछ मिल गया है, जो कि खोज में पैरालैक्स टेबल व्यू के ठीक नीचे है।
एक ही तरीका है कि मैंने उस हेडर दृश्य को आकार देने के लिए प्रोग्रामिक रूप से निम्न कोड के साथ पाया है:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
इस मामले में, शीर्ष लेखफ्रैमहाइट टेबल व्यूहाइडर ऊंचाई की एक मैनुअल गणना है जो निम्नानुसार है (इनरहेडर व्यू सफेद क्षेत्र है, या दूसरा "दृश्य" है, हेडर व्यू टेबलहैडर व्यू है) :
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
मैनुअल गणना काम करती है, लेकिन अगर भविष्य में चीजें बदल जाती हैं तो यह स्पष्ट है और त्रुटि की संभावना है। मैं जो करने में सक्षम होना चाहता हूं, वह प्रदान की गई बाधाओं के आधार पर tableHeaderView ऑटो-आकार है, जैसे आप कहीं और कर सकते हैं। लेकिन मेरे जीवन के लिए, मैं इसका पता नहीं लगा सकता।
इस बारे में SO पर कई पोस्ट हैं, लेकिन कोई भी स्पष्ट नहीं है और मुझे और अधिक भ्रमित कर रहा है। यहाँ कुछ है:
क्या UITableView की तालिकाHeaderView के साथ AutoLayout का उपयोग करना संभव है?
ऑटो लेआउट, IB और फ़ॉन्ट आकार का उपयोग करते समय तालिका शीर्ष लेख दृश्य ऊंचाई गलत है
यह वास्तव में अनुवाद बदलने के लिए समझ में नहीं आता है। कोई भी मेरे लिए त्रुटियों का कारण बनता है और वैसे भी वैचारिक रूप से समझ में नहीं आता है।
आपकी किसी भी मदद के हम दिल से आभारी होंगे!
EDIT 1: टॉमस्विफ्ट के सुझाव के लिए धन्यवाद, मैं यह पता लगाने में सक्षम था। अवलोकन की ऊंचाई की मैन्युअल रूप से गणना करने के बजाय, मैं इसे निम्नानुसार मेरे लिए गणना कर सकता हूं और फिर तालिकाहैडर व्यू को पहले से फिर से सेट कर सकता हूं।
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.innerHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.innerHeaderView.frame.origin.y; // adding the origin because innerHeaderView starts partway down headerView.
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
संपादित करें 2: जैसा कि अन्य ने नोट किया है, संपादित 1 में पोस्ट किया गया समाधान, व्यूडेलड में काम नहीं करता है। हालाँकि, यह देखने में काम करता है, फिर भी WillLayoutSubviews में देखें। नीचे उदाहरण कोड:
// Note 1: The variable names below don't match the variables above - this is intended to be a simplified "final" answer.
// Note 2: _headerView was previously assigned to tableViewHeader (in loadView in my case since I now do everything programatically).
// Note 3: autoLayout code can be setup programatically in updateViewConstraints.
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[_headerWrapper setNeedsLayout];
[_headerWrapper layoutIfNeeded];
CGFloat height = [_headerWrapper systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = _headerWrapper.frame;
headerFrame.size.height = height;
_headerWrapper.frame = headerFrame;
_tableView.tableHeaderView = _headerWrapper;
}
setTableHeaderView
Xcode6 पर काम नहीं करता है। समस्या यह है कि टेबलहैडर व्यू द्वारा कोशिकाओं को ओवरलैप किया जाता है। हालाँकि, यह Xcode5