कोको ऑटोलैयूट: कंटेंट हगिंग बनाम कंटेंट कम्प्रेशन रेजिस्टेंस प्राथमिकता


643

मुझे कोको ऑटोलैयूट के बारे में कंटेंट हगिंग और कम्प्रेशन रेसिस्टेंस के अंतर के बारे में Apple डॉक्यूमेंट पर स्पष्ट उत्तर नहीं मिल रहा है।

क्या कोई उनके उपयोग और अंतर की व्याख्या कर सकता है?


49
जीवन का एक प्रमुख रहस्य यह है कि उन्होंने इसे केवल "विस्तार प्रतिरोध" क्यों नहीं कहा। दो गुण "विस्तार प्रतिरोध" और "संपीड़न प्रतिरोध" से अधिक कुछ नहीं हैं । "हगिंग" शब्दावली पागल है।
fattie

3
अगर आपके पास बहुत ज्यादा जगह है तो content-hugging: सफेद जगह होने के खिलाफ लड़ना होगा। यह सिर्फ आपके आस-पास देखने के लिए मजबूर कर देगा। लेकिन अगर आपके पास बहुत अधिक जगह नहीं है, और इसके बजाय बहुत कम जगह है, तो content-compressions-resistanceअपने दृश्य के खिलाफ लड़ने के लिए अपने सभी सामग्री को दिखाने में सक्षम नहीं होने से, जैसे लेबल टुकड़े-टुकड़े हो जाएंगे।
हनी

जवाबों:


1319

अवधारणाओं का एक त्वरित सारांश:

  • गले लगना => सामग्री विकसित नहीं होना चाहता
  • संपीड़न प्रतिरोध => सामग्री सिकुड़ना नहीं चाहती

उदाहरण:

कहो कि आपको एक बटन मिल गया है:

[       Click Me      ]

और आपने प्राथमिकता 500 के साथ किनारों को बड़े सुपरवाइवे में पिन किया है।

फिर, यदि हगिंग प्राथमिकता> 500 यह इस तरह दिखेगा:

[Click Me]

यदि हगिंग प्राथमिकता <500 यह इस तरह दिखेगा:

[       Click Me      ]

यदि पर्यवेक्षण अब सिकुड़ता है, यदि संपीड़न प्रतिरोध प्राथमिकता> 500, तो यह इस तरह दिखेगा

[Click Me]

और अगर संपीड़न प्रतिरोध प्राथमिकता <500, यह इस तरह लग सकता है:

[Cli..]

अगर यह इस तरह से काम नहीं करता है, तो आप शायद कुछ अन्य बाधाओं पर जा रहे हैं जो आपके अच्छे काम को गड़बड़ कर रहे हैं!

उदाहरण के लिए, आप इसे 1000 की प्राथमिकता के साथ पर्यवेक्षक को दे सकते हैं। या आप एक चौड़ाई प्राथमिकता कर सकते हैं। यदि हां, तो यह मददगार हो सकता है:

संपादक> आकार फ़िट सामग्री के लिए


37
क्या होगा अगर हगिंग प्राथमिकता == 500?
bradley.ayers

1
मुझे लगता है (लेकिन यह आमतौर पर एक अच्छा विचार नहीं है) इसे विशिष्ट गोलाई व्यवहार की तरह> 500 माना जाएगा। हालांकि यह परीक्षण नहीं किया गया है।
जोशुआ नोजि

सबसे अधिक संभावना है कि आपको "एक साथ बाधाओं को संतुष्ट करने में असमर्थ" रनटाइम में चेतावनी
मिलेगी

8
@ bradley.ayers To MaxDesyatov की टिप्पणी, यह तभी होगा जब आपके पास आवश्यक प्राथमिकता (1000) के साथ परस्पर विरोधी बाधाएँ होंगी। यदि दो निचले-प्राथमिकता वाले अवरोधों का सामना करते हैं, तो समाधान अस्पष्ट है इसलिए ऑटो लेआउट इंजन केवल एक वैध समाधान चुन लेगा और यही आप देखेंगे (कोई चेतावनी नहीं)। जाहिर है कि यह अच्छा नहीं है, क्योंकि यह अब ऑटो लेआउट इंजन के आंतरिक कार्यान्वयन पर निर्भर है, यह चुनने के लिए कि आपका लेआउट कैसा दिखता है, और सैद्धांतिक रूप से यह एक iOS संस्करण से अगले में बदल सकता है!
स्माइबॉर्ग

प्राथमिकता डिफ़ॉल्ट को गले लगाने वाली सामग्री 250 है, और सामग्री संपीड़न प्रतिरोध डिफ़ॉल्ट 750 है। तो 500 का उपयोग क्यों करें?
ZYiOS

292

ऑटोलैयूट के बारे में इस वीडियो ट्यूटोरियल पर एक नज़र डालें , वे इसे ध्यान से समझाते हैं

यहाँ छवि विवरण दर्ज करें


1
@fatuhoku आप फिर से जांच कर सकते हैं, यह वीडियो मुफ्त है
onmyway133

31
हगिंग बनाम प्रतिरोध की चर्चा वीडियो में 13:15 बिंदु पर शुरू होती है।
कार्ल स्मिथ

1
@ onmyway133 यह एकदम सही वीडियो है, लेकिन दुर्भाग्य से कोई उदाहरण नहीं है कि रे इसका उपयोग कैसे करते हैं।
मटरू अलेक्जेंडर

@MatrosovAlexander मुझे लगता है कि एक बहुत ही व्यावहारिक उदाहरण Autolayout fantageek.com/1468/… के
onmyway133

1
वह दिखाता है कि कैसे 18:05 पर संपीड़न प्रतिरोध का उपयोग करने
ब्रेंट Faust

187

यहाँ छवि विवरण दर्ज करें

स्रोत: @ मोकगिओ

आंतरिक सामग्री का आकार - सुंदर आत्म-व्याख्यात्मक, लेकिन परिवर्तनीय सामग्री वाले विचारों से पता चलता है कि उनकी सामग्री कितनी बड़ी है और इस संपत्ति के माध्यम से उनकी सामग्री का आकार वर्णन करता है। आंतरिक सामग्री के आकार वाले विचारों के कुछ स्पष्ट उदाहरण हैं UIImageViews, UILabels, UIButtons।

कन्टैंट हगिंग प्राथमिकता - यह प्राथमिकता जितनी अधिक होती है, उतनी ही अधिक दृश्य इसके आंतरिक सामग्री आकार से बड़ा होता है।

सामग्री संपीड़न प्रतिरोध प्राथमिकता - यह प्राथमिकता जितनी अधिक होती है, उतना ही अधिक दृश्य इसके आंतरिक सामग्री आकार से छोटा सिकुड़ता है।

अधिक विवरण के लिए यहां देखें: AUTO LAYOUT MAGIC: CONTENT SIZING PRIORITIES


चित्रण अच्छा है लेकिन कम से कम कहने के लिए भ्रामक है। शीर्ष व्यक्ति को यह कहना चाहिए कि "मैं नहीं होने वाला (मुझे ME) बढ़ने दो"। बच्चे का दृष्टिकोण अपने आप को परिभाषित करता है कि यह सामग्री गले लगाने के व्यवहार के माध्यम से विकसित नहीं करना चाहता है। कोई एक्सोजेनिक फोर्स नहीं है (सचित्र हाथों की तरह) जो इसे बढ़ने से रोकते हैं। यह एक बहुत बड़ा अंतर है।
मैनुअल

6
मैं इसे सिर्फ इसलिए वोट कर रहा हूं क्योंकि मुझे दृष्टांत पसंद है।
जेम्स बुकानेक

3
यही कारण है कि मैं स्टैक ओवरफ्लो से प्यार करता हूं ... स्नोक्रैश का वर्णन और साथ में मोकैगियो द्वारा यह चित्रण = इन गुणों का सबसे अच्छा विवरण कहीं भी (एप्पल के स्वयं के प्रलेखन सहित)।
काल

40

मान लें कि आपके पास "क्लिक मी" टेक्स्ट के साथ एक बटन है। उस बटन की चौड़ाई कितनी होनी चाहिए?

सबसे पहले, आप निश्चित रूप से बटन को पाठ से छोटा नहीं करना चाहते हैं। अन्यथा, पाठ क्लिप किया जाएगा। यह क्षैतिज संपीड़न प्रतिरोध प्राथमिकता है।

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


19

यदि view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, तो ऑटो लेआउट एक विशेष प्रकार की बाधा बनाता है NSContentSizeLayoutConstraint। यह बाधा दो सामान्य बाधाओं की तरह काम करती है:

  • view.width <= view.intrinsicContentSize.widthक्षैतिज गले लगाने की प्राथमिकता के साथ एक बाधा की आवश्यकता होती है, और
  • view.width >= view.intrinsicContentSize.widthक्षैतिज संपीड़न प्रतिरोध प्राथमिकता के साथ एक बाधा की आवश्यकता होती है।

स्विफ्ट में, iOS 9 के नए लेआउट एंकर के साथ, आप इस तरह से समान बाधाओं को सेट कर सकते हैं:

let horizontalHugging = view.widthAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalHugging.priority = view.contentHuggingPriority(for: .horizontal)

let horizontalCompression = view.widthAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalCompression.priority = view.contentCompressionResistancePriority(for: .horizontal)

इसी तरह, यदि view.intrinsicContentSize.height != NSViewNoIntrinsicMetric, तो ऑटो लेआउट NSContentSizeLayoutConstraintदृश्य की ऊंचाई पर दो बाधाओं की तरह काम करता है। कोड में, वे इस तरह दिखेंगे:

let verticalHugging = view.heightAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalHugging.priority = view.contentHuggingPriority(for: .vertical)

let verticalCompression = view.heightAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalCompression.priority = view.contentCompressionResistancePriority(for: .vertical)

लेआउट के चलने के बाद आप इन विशेष NSContentSizeLayoutConstraintउदाहरणों को देख सकते हैं (यदि वे मौजूद हैं) view.constraints। उदाहरण:

label.constraints.forEach { print($0) }

// Output:
<NSContentSizeLayoutConstraint:0x7fd82982af90 H:[UILabel:0x7fd82980e5e0'Hello'(39)] Hug:250 CompressionResistance:750>
<NSContentSizeLayoutConstraint:0x7fd82982b4f0 V:[UILabel:0x7fd82980e5e0'Hello'(21)] Hug:250 CompressionResistance:750>

1
यह नहीं होना चाहिए: वर्टिकलकंपेशन = view.heightAnchor.constraint (अधिक से अधिक ThanOrEqualToConstant: view.intrinsicContentSize.height)
mc_plectrum

1
हां, मैंने कॉपी / पेस्ट त्रुटि की है। मैंने इसे सुधारा है। मुझे जानकारी देने के लिए धन्यवाद।
लूटना

15

कंटेंट हगिंग और कंटेंट कम्प्रेशन रेजिस्टेंस प्राथमिकताएँ उन तत्वों के लिए काम करती हैं, जो उन सामग्रियों के आधार पर आंतरिक रूप से उनके आकार की गणना कर सकते हैं जो अंदर आ रहे हैं।

से एप्पल डॉक्स :

यहाँ छवि विवरण दर्ज करें


छवि के लिए plus1 (Y)
नूर अली बट

मैं उलझन में हूं। एक टेक्स्ट दृश्य के लिए जिसमें स्क्रॉलिंग सक्षम नहीं है। क्या इसका मतलब है कि प्रति उपयोगकर्ता टाइपिंग में आंतरिक आकार बदल जाएगा?
हनी

@ मुझे लगता है कि सही बाधाओं के साथ सेट और स्क्रॉल करने में अक्षम, पाठ दृश्य को आंतरिक ऊंचाई बताने में सक्षम होना चाहिए।
देव जीआर

मेरे सवाल का जवाब नहीं दिया। आपका मतलब है कि अगर मैं टेक्स्ट व्यू के मौजूदा आकार से बहुत अधिक, बहुत कुछ टाइप करता हूं .... तो क्या टेक्स्ट व्यू स्वचालित रूप से विस्तारित होता है और आंतरिक आकार बदलता है?
हनी

इसे स्वयं आज़माएं। टेक्स्टव्यू को एक निश्चित चौड़ाई दें और स्क्रॉल को अक्षम करें और वांछित व्यवहार की जांच करें। अधिक उत्तरों के लिए stackoverflow.com/a/21287306/1526629 देखें ।
देव जीआर

11

Content hugging priorityएक की तरह है रबर बैंड है कि एक दृश्य के आसपास रखा गया है। प्राथमिकता मूल्य जितना अधिक होगा, रबर बैंड उतना ही मजबूत होगा और जितना अधिक वह अपने सामग्री आकार को गले लगाना चाहेगा। प्राथमिकता मूल्य को रबर बैंड की "ताकत" की तरह कल्पना की जा सकती है

और यह Content Compression Resistanceहै कि, "व्यूज" कितना छोटा होता जा रहा है । उच्च प्रतिरोध प्राथमिकता मूल्य वाला दृश्य वह है जो संपीड़न का विरोध करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.