आगे की जांच (सेल के सबव्यू पदानुक्रम को देखते हुए) इंटरफेस बिल्डर सेल के contentView
के भीतर सबव्यूव्स रखता है, यह ऐसा नहीं लगता है।
इस मुद्दे का मूल कारण आईओएस 6 ऑटोलाउट था। जब कक्ष संपादन मोड (और इंडेंट) में रखा जाता है तो contentView
भी इंडेंट किया जाता है, इसलिए इसका कारण यह है कि contentView
के भीतर सभी सबव्यू contentView
के भीतर होने के कारण (इंडेंट) स्थानांतरित हो जाएंगे। हालांकि, इंटरफेस बिल्डर द्वारा लागू सभी ऑटोलायआउट बाधा contentView
के बजाय UITableViewCell
के सापेक्ष प्रतीत होती है। इसका मतलब है कि contentView
इंडेंट्स के बावजूद, सबव्यूज़ में शामिल नहीं है - बाधाएं चार्ज करती हैं।
उदाहरण के लिए, जब मैंने सेल में UILabel
रखा (और सेल के बाएं हाथ से 10 अंक रखे) आईबी ने स्वचालित रूप से एक बाधा "क्षैतिज अंतरिक्ष (10)" लागू की। हालांकि, यह बाधा UITableViewCell
से संबंधित है contentView
नहीं। इसका मतलब यह है कि जब सेल इंडेंट किया जाता है, और contentView
चाल चलता है, तो लेबल रहता है क्योंकि यह UITableViewCell
के बाईं ओर से 10 अंक बने रहने के लिए बाध्यता का अनुपालन कर रहा है।
दुर्भाग्य से (जहां तक मुझे पता है) आईबी के भीतर से इन आईबी निर्मित बाधाओं को दूर करने का कोई तरीका नहीं है, इसलिए यहां समस्या को हल किया गया है।
सेल के लिए UITableViewCell
उप-वर्ग के भीतर, मैंने cellLabelHSpaceConstraint
नामक उस बाधा के लिए IBOutlet
बनाया। लेबल के लिए आपको IBOutlet
की भी आवश्यकता है, जिसे मैंने cellLabel
कहा था। मैं तो कार्यान्वित नीचे के अनुसार -awakeFromNib
विधि:
- (void)awakeFromNib {
// -------------------------------------------------------------------
// We need to create our own constraint which is effective against the
// contentView, so the UI elements indent when the cell is put into
// editing mode
// -------------------------------------------------------------------
// Remove the IB added horizontal constraint, as that's effective
// against the cell not the contentView
[self removeConstraint:self.cellLabelHSpaceConstraint];
// Create a dictionary to represent the view being positioned
NSDictionary *labelViewDictionary = NSDictionaryOfVariableBindings(_cellLabel);
// Create the new constraint
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-10-[_cellLabel]" options:0 metrics:nil views:labelViewDictionary];
// Add the constraint against the contentView
[self.contentView addConstraints:constraints];
}
सारांश में, ऊपर क्षैतिज रिक्ति बाधा जो आईबी स्वचालित रूप से जोड़ निकाल देंगे (के रूप में नहीं बल्कि contentView
से UITableViewCell
के खिलाफ प्रभावी है) और फिर हम परिभाषित करने और जोड़ने contentView
पर हमारी अपनी बाधा।
मेरे मामले में, सेल में अन्य सभी UILabels
cellLabel
की स्थिति के आधार पर स्थित थे, इसलिए जब मैंने इस तत्व की बाधा/स्थिति तय की, तो बाकी सभी सही ढंग से उपयुक्त और व्यवस्थित हुए। हालांकि, यदि आपके पास अधिक जटिल लेआउट है तो आपको अन्य सबव्यू के लिए भी ऐसा करने की आवश्यकता हो सकती है।
क्या आप इसके बारे में निश्चित हैं? पिछली बार जब मैंने एक सेल को एक निब में रखा था, जबकि ऐसा नहीं लगता था कि मैं सामग्री दृश्य में उप-दृश्य जोड़ रहा था, डीबगर में रन टाइम पर सबकुछ सामग्री दृश्य में था। यदि आप पहले से नहीं हैं तो डीबगर में सत्यापित करने योग्य मूल्य ... –
धन्यवाद कार्ल। आप सही थे - सभी दृश्यों को सामग्री दृश्य में जोड़ा गया है। समस्या आईओएस 6 autolayout से संबंधित थी। मैंने एक उत्तर शामिल किया है जो बताता है कि समस्या को कैसे ठीक किया गया था। – Skoota