apple - IOS8 टुडे एक्सटेंशन की ऊंचाई केवल ऑटो लेआउट का उपयोग करके टूटी हुई बाधाओं को देता है



itunes login (2)

कुछ प्रयोग करने के बाद, और " क्या है NSLayoutConstraint" UIView-Encapsulated-Layout-Height "को ठोकर मारना और मुझे इसे कैसे साफ़ करने के लिए मजबूर करने के बारे में जाना चाहिए " मैंने निर्धारित किया कि आप "Height" और "समान ऊँचाई" का उपयोग करके इस समस्या को दरकिनार कर सकते हैं। या "ऊँचाई" और ऊपर और नीचे "ऊर्ध्वाधर स्थान" (जैसा कि गिलहर्मे स्प्रिंट द्वारा सुझाया गया है), और फिर ऊंचाई की "प्राथमिकता" घटकर 999 हो गई।

यह वह उत्तर नहीं है जिसकी मैं उम्मीद कर रहा था, लेकिन यह सबव्यू के ऑटो लेआउट के माध्यम से कंटेनर की ऊंचाई को निर्दिष्ट करता है और टूटी हुई बाधाओं के बारे में किसी भी चेतावनी से बचा जाता है।

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

https://src-bin.com

Apple दस्तावेज़ीकरण से पता चलता है कि Autolayout का उपयोग करके आज एक्सटेंशन की ऊंचाई निर्धारित की जाती है।

यदि किसी विजेट में प्रदर्शन की अतिरिक्त सामग्री है, तो आप विजेट की ऊंचाई को उचित रूप से समायोजित करने के लिए ऑटो लेआउट बाधाओं पर भरोसा कर सकते हैं। यदि आप ऑटो लेआउट का उपयोग नहीं करते हैं, तो आप विजेट की नई ऊंचाई निर्दिष्ट करने के लिए UIViewController संपत्ति का उपयोग कर सकते हैं।

हालाँकि, प्रत्येक उदाहरण और ट्यूटोरियल जो मैंने देखा है, वह preferredContentSize का उपयोग कर समाप्त होता है।

मेरे सभी प्रयास टूटे हुए अवरोधों की चेतावनी के लिए ऑटोलैयट लीड के माध्यम से ऊंचाई निर्धारित करने के लिए।

हाइट वाया ऑटोलैयट सेट करना

मैंने एक नए xcode टेम्पलेट के साथ शुरुआत की, और एक ताज़ा आज एक्सटेंशन टेम्पलेट। केवल एक चीज जिसे TodayViewController.m में जोड़ा था:

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
    return UIEdgeInsetsMake(0, 0, 0, 0);
}

नोट: मुझे अभी भी यह समस्या है अगर मैं केवल डिफ़ॉल्ट मार्जिन का उपयोग करता हूं।

मैंने लेबल की ऊँचाई को बाधित किया, कंटेनर में लेबल को केन्द्रित किया, और कंटेनर की ऊँचाई को लेबल की ऊँचाई के बराबर करने के लिए विवश किया:

यह एक लेबल के लिए नेतृत्व करना चाहिए जो कंटेनर को निर्दिष्ट ऊँचाई पर बिना किसी बाधा के भरता है। इसके बजाय मुझे एक बाधा संघर्ष मिलता है:

2014-09-28 10:27:39.254 TodayExtension[61090:2672196] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f8b8b62c670 V:[UILabel:0x7f8b8b62d9b0'Hello World'(124)]>",
    "<NSLayoutConstraint:0x7f8b8b583020 UIView:0x7f8b8b62d6e0.height == UILabel:0x7f8b8b62d9b0'Hello World'.height>",
    "<NSLayoutConstraint:0x7f8b8b5888a0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7f8b8b62d6e0(667)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f8b8b62c670 V:[UILabel:0x7f8b8b62d9b0'Hello World'(124)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

जिस तरह से यह बाधाओं को तोड़ता है, यह वास्तव में ऐसा लग रहा है जैसे मैं चाहता हूं:

हालांकि, अन्य परियोजनाओं में, यह अन्य बाधाओं को तोड़ने का फैसला करता है और यह सही नहीं लगता है। इसके अलावा, साइड नोट: अगर मैं कोशिश करता हूं और ऊंचाई की प्राथमिकता को बदल देता हूं तो इससे Xcode क्रैश हो जाता है। तो यह मजेदार है।

विवश नहीं ऊंचाई

मुझे उम्मीद थी कि जब से ऊंचाई पर काम करने में बाधा नहीं आई, शायद अगर मैं कंटेनर की ऊंचाई को साक्षात्कारों के लिए विवश नहीं करता, तो शायद यह जरूरी है कि यह आवश्यक ऊँचाई को सब-हाउस में ले जाए और खुद को सही ढंग से सेट करे।

मैंने उप-केंद्र को केंद्रित किया और इसकी ऊंचाई को बाधित किया:

यह सिर्फ एक एक्सटेंशन के लिए गया, जो अधिसूचना केंद्र की पूरी ऊंचाई का उपयोग करता है, और मेरे सही आकार में लंबवत केंद्रित है:

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

क्या देता है?

मुझे पता है कि मैं सिर्फ preferredContentSize उपयोग कर सकता हूं, लेकिन फिर Apple यह क्यों कहेगा कि इसे ऑटो लेआउट बाधाओं का उपयोग करके सेट किया जा सकता है? मैं क्या गलत कर रहा हूं?

मेरे द्वारा दिए गए उदाहरणों से स्पष्ट रूप से वंचित हैं। मैं दृश्य की ऊंचाई सेट कर रहा हूं, तो क्यों न सिर्फ कंटेनर की ऊंचाई निर्धारित करें, है ना? एक वास्तविक परियोजना में इस बिंदु का हिस्सा केवल ऑटोलैयूट का उपयोग करके चौड़ाई के आधार पर विजेट की ऊंचाई निर्धारित करना होगा।


Answer #1

टुडे एक्सटेंशन को आप वास्तव में चाहते हैं कि आकार बनाने के लिए आपको कुल 5 बाधाओं को परिभाषित करना चाहिए।

4 बाधाएं पर्यवेक्षण के साथ संबंध को परिभाषित करेंगी:

  • शीर्ष स्थान
  • नीचे का स्थान
  • अग्रणी स्थान
  • ट्रेलिंग स्पेस

वैसे, आपको इस अड़चन को लेआउट मार्जिन पर लटका देना चाहिए, क्योंकि Apple दृश्य और विशेष रूप से आज के एक्सटेंशन के लिए अनुशंसा करता है।

5 वीं बाधा उपक्षेत्र के लिए ऊंचाई होगी। यह बाधा, ऊपर और नीचे के रिक्त स्थान के साथ मिलकर, आज टैब के अंदर आपके अनुभाग के सटीक आकार को परिभाषित करेगी।

बस यह बताते हुए कि, ऊँचाई की बाधा सबव्यू के लिए एक स्थिरांक निर्धारित करेगी, और ऊपर और नीचे की बाधाएँ सबवे किनारों पर सुपरवाइज़ को "गोंद" करेंगी।





ios8-today-widget