UIStackView के अंदर जोड़े गए दृश्य में अग्रणी पैडिंग कैसे जोड़ें


125

यह मेरा सेटअप है: मेरे पास UIScrollViewअग्रणी, शीर्ष, ट्रायलिंग एज के साथ 0. सेट है। इसके अंदर मैं UIStackViewइस बाधा के साथ जोड़ता हूं :

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

स्टैक दृश्य के अंदर मैं कुछ दृश्य जोड़ता हूं।
मेरा मुद्दा यह है कि बाधाओं के कारण स्टैक दृश्य में जोड़ा गया पहला दृश्य भी अग्रणी बढ़त = 0 होगा।

ऐसे कौन से तरीके हैं जिनसे मैं पहले दृश्य में कुछ पैडिंग जोड़ सकता हूं? स्क्रॉल दृश्य बाधाओं को समायोजित किए बिना।


2
क्या आप स्वीकृत उत्तर को बदलना चाहेंगे? टॉल्गा का जवाब बहुत बेहतर लगता है।
हनी

जवाबों:


26

आपके द्वारा दिया गया समाधान आपके UIStackView के अंदर अपने विचारों के लिए एक पैडिंग नहीं जोड़ता है (जैसा कि आप प्रश्न में चाहते थे), लेकिन यह UIStackView के लिए एक अग्रणी जोड़ता है।

एक समाधान आपके मूल UIStackView के अंदर एक और UIStackView को जोड़ने और इस नए UIStackVIew को अग्रणी देने का हो सकता है। फिर, इस नए UIStackView में अपने विचार जोड़ें।

संकेत, आप पूरी तरह से इंटरफ़ेस बिल्डर का उपयोग कर सकते हैं। दूसरे शब्दों में, इसके लिए कोड लिखने की आवश्यकता नहीं है।


374

जब isLayoutMarginsRelativeArrangementसंपत्ति सही होती है, तो स्टैक दृश्य अपने लेआउट मार्जिन के सापेक्ष अपने व्यवस्थित विचारों को लेआउट करेगा।

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

लेकिन यह स्टैक दृश्य के अंदर सभी व्यवस्थित दृश्यों को प्रभावित करता है। यदि आप केवल एक व्यवस्थित दृश्य के लिए यह पैडिंग चाहते हैं, तो आपको नेस्टेड का उपयोग करने की आवश्यकता हैUIStackView


2
isLayoutMarginsRelativeArrangementएक गेट्टर है, सेटर है layoutMarginsRelativeArrangement। मैं उत्तर को संपादित नहीं कर सकता
Ma

5
@ स्विफ्ट में गेट्टर और सेटर फ़ंक्शन के बीच कोई अंतर नहीं है। लेकिन आप सही हैं, उद्देश्य-सी के साथ विकसित होने वाले लोगों को layoutMarginsRelativeArrangementइसके बजाय उपयोग करना चाहिए । आधिकारिक दस्तावेज: developer.apple.com/reference/uikit/uistackview/…
टॉल्गा ओकुर

3
उद्देश्य-सी के लिए:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Snouto

4
फरवरी 2019 की आधी रात को ऑफिस में बैठे-बैठे इस तरह के जवाब मुझे आगे बढ़ने की ताकत देते हैं। धन्यवाद @tolpp
nefarianblack

155

मैंने पाया है कि बाधाएं स्टैक व्यू के अंदर काम नहीं करती हैं, या वे कुछ अजीब लगते हैं।

(जैसे कि अगर मैं छवि स्टैकव्यू में चयनित होने के लिए अग्रणी / अनुगामी बाधा जोड़ता हूं, जो संग्रह में भी अग्रणी बनाता है, लेकिन अनुगामी जोड़ नहीं करता है, और यह सुनिश्चित करने के लिए संघर्ष हो सकता है)।

स्टैकव्यू के अंदर स्टैकव्यू

स्टैकव्यू के अंदर सभी दृश्यों के लिए लेआउट मार्जिन सेट करने के लिए, चुनें:

Stack View > Size Inspector > Layout Margins > Fixed

नोट: "Fixed"विकल्प को पहले कहा जाता था "Explicit", जैसा कि स्क्रीनशॉट में देखा गया है।

फिर अपनी गद्दी जोड़ें:

स्टोरीबोर्ड


23
Apple में से एक चीज़ छिपती है। मुझे नफरत है कि Xcode अच्छे, मैत्रीपूर्ण और आसान के विपरीत कैसे है। धन्यवाद
डक

जब मैं उन स्पष्ट लेआउट मार्जिन को बदलता हूं तो Xcode दुर्घटनाग्रस्त होता रहता है। बग दर्ज किया लेकिन उन्होंने जवाब दिया कि यह एक डुप्लिकेट था।
मावंडिलीन

यही वह है जो मुझे यूआई में नहीं मिला। स्टैक व्यू मार्जिन के लिए फ़ील्ड देखने के लिए लेआउट मार्जिन को स्पष्ट करने के लिए बदलें।
pkamb

13
FYI करें XCode 9 अब इसे "स्पष्ट" के बजाय "फिक्स्ड" कहता है।
मेल

इसके अलावा Xcode 9 में, फ़ाइल इंस्पेक्टर में "सेफ एरिया लेआउट गाइड्स का उपयोग करें" को अनचेक करें, जो लिखने के रूप में आईबी में अभी भी बहुत सारी समस्याओं का कारण बनता है, और आपके बाधाओं के लिए सामान्य लेआउट गाइड के साथ छड़ी।
PJ_Finnegan 12

16

मेरे लिए जो काम किया गया है वह स्टैक को देखने के लिए एक और यूआईईवीवाई जोड़ना है जो सिर्फ एक स्पेसर है (कम से कम स्टैक व्यू.डिस्ट्रिएशन = .Fill के साथ काम करता है):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...

6

स्विफ्ट 3: आपको बस सेट ऑफ़सेट चाहिए:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

सुनिश्चित करें कि यह बाधा आपके बाद निर्धारित की गई है parentView.addArrangdSubView(firstView)


4

यदि आपको केवल अग्रणी पैडिंग की आवश्यकता है, तो आप स्टैक दृश्य के संरेखण को "ट्रेलिंग" पर सेट कर सकते हैं और फिर आप इसके प्रत्येक निहित साक्षात्कार पर अद्वितीय अग्रणी बाधाओं को निर्दिष्ट करने के लिए स्वतंत्र होंगे।

एक बोनस के रूप में, आप स्टैक दृश्य के संरेखण को "केंद्र" पर सेट कर सकते हैं और फिर आप प्रत्येक आइटम को दोनों तरफ से अपनी पैडिंग देने के लिए लीडिंग और / या ट्रेलिंग बाधाओं का उपयोग कर सकते हैं।


1

इस प्रश्न के पहले से ही अच्छे उत्तर हैं, हालांकि एक सुझाव, spacingसंपत्ति का उपयोग विचारों के बीच अंतर निर्धारित करने के लिए करें। पहले और अंतिम विचारों के लिए दो विकल्प हो सकते हैं, या तो इनसेट्स को सेट करें जैसा कि @tolpp ने सुझाव दिया है या पैडिंग जोड़ने के लिए स्थिर के साथ माता-पिता (स्टैकव्यू) से जुड़ी बाधाएं जोड़ें।


0

हमने जो किया वह पारदर्शी घटक (जैसे, UIButton / UIView) को UIStackView के पहले और अंतिम बच्चों के रूप में जोड़ा गया। फिर इन अदृश्य बच्चों की गद्दी को समायोजित करने के लिए चौड़ाई निर्धारित करें।


0

समाधान यह होगा कि स्टैक दृश्य में एक नियमित दृश्य हो, ताकि आप जो भी अवरोधों को जोड़ना चाहते हैं, उसे पकड़ सकें और फिर आप अपने आइटमों के लिए उन बाधाओं को जोड़ सकें जो स्टैक दृश्य में विचारों के सापेक्ष हैं। इस तरह, आपके मूल विचारों में स्टैक दृश्य के भीतर बाधाएँ उत्पन्न हो सकती हैं।

यह इंटरफ़ेस बिल्डर और प्रोग्रामेटिक रूप से किया जा सकता है।


-3

ऐसा लगता है कि समाधान बहुत सरल था। के बजाय:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

मैंने अभी लिखा है:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

1
वास्तव में आपका कोड urscrollview के अंदर uistackview के लिए एक अग्रणी जोड़ता है, यह आपके uistackview के अंदर अपने विचारों के लिए एक पैडिंग नहीं जोड़ता है, (प्रश्न के रूप में)
विलियम किना

हाँ, लेकिन मुझे नहीं पता कि क्या आप पैडिंग जोड़ सकते हैं, इसलिए यह मेरे लिए काम करेगा।
एड्रियन

पहले विचार के रूप में, आप अपने मूल uistackview को प्रेरित कर सकते हैं और इसे पैडिंग दे सकते हैं। फिर अपने विचारों को इस नए uistackview में जोड़ें (आप इंटरफ़ेस बिल्डर द्वारा पूरी तरह से ऐसा कर सकते हैं, इसके लिए कोड लिखने की आवश्यकता नहीं है)
विलियम कीनान

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