IPhone UIView z इंडेक्स कैसे सेट करें?


252

मैं एक दृश्य को दूसरे के ऊपर ले जाना चाहता हूं, मैं दृश्य के z सूचकांक को कैसे जान सकता हूं, और शीर्ष पर कैसे आगे बढ़ूं?

जवाबों:


279

UIViewभाई-बहन उस क्रम में ढेर हो जाते हैं जिसमें उन्हें उनके पर्यवेक्षण के लिए जोड़ा जाता है। UIViewपदानुक्रम के तरीकों और गुण दृश्य आदेश का प्रबंधन करने के देखते हैं। UIView.h में:

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;

- (void)removeFromSuperview;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;

- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;

साहसी दृश्य वापस subviewsसरणी में सामने करने का आदेश दिया जाता है । तो सबसे ऊपरी दृश्य होगा:

[parentView.subviews lastObject];

और नीचे का दृश्य होगा:

[parentView.subviews objectAtIndex:0];

जैसे कॉलिन क्रिविंकल ने कहा, [parentView bringSubviewToFront:view]दृश्य को शीर्ष पर लाएगा, लेकिन यह केवल मामला है अगर विचार पदानुक्रम में सभी भाई बहन हैं।


329

आप zPositionदृश्य के CALayerz-index को बदलने के लिए दृश्य की परत की संपत्ति का उपयोग कर सकते हैं (यह एक वस्तु है)।

theView.layer.zPosition = 1;

जैसा कि विक्टर नॉर्डलिंग ने कहा, "बड़े मूल्य शीर्ष पर हैं। आप नकारात्मक मूल्यों सहित किसी भी मूल्य का उपयोग कर सकते हैं।" डिफॉल्यू मूल्य शून्य है।

आपको परत तक पहुंचने के लिए क्वार्ट्जकोर ढांचे को आयात करने की आवश्यकता है। बस अपनी कार्यान्वयन फ़ाइल के शीर्ष पर कोड की इस पंक्ति को जोड़ें।

#import "QuartzCore/QuartzCore.h"

7
सहायक के रूप में, बड़े मूल्य "शीर्ष पर" हैं। आप नकारात्मक मूल्यों सहित, अपने इच्छित मूल्यों का उपयोग कर सकते हैं।
विक्टर नॉर्डलिंग

12
यह समाधान उस स्थिति में बेहतर है जब आप चाहते हैं कि आपका दृष्टिकोण हमेशा शीर्ष पर रहे। बस MAXFLOAT पर सेट करें
मुहम्मद हसन नसर

27
मैंने अभी-अभी सीखा है कि परत के zPosition, और UIView के इनपुट हैंडलर, दो अलग-अलग Z- ऑर्डर पर हैं। यह वास्तव में अजीब है जब आपके क्लिक "से गुजरते हैं"
स्टीफन जे

क्या कार्य करने के लिए विचारों का पर्यवेक्षण एक जैसा होना चाहिए zPosition?
१५:१३ बजे १०:१५ पर ह्लंग

3
मैंने देखा कि भले ही दृश्य शीर्ष पर है, क्लिक इसके नीचे की वस्तुओं पर जाते हैं। यह एक बग माना जाना चाहिए। मैं उस समस्या से बचने के लिए एक सामान्य तरीका खोजने की कोशिश कर रहा हूं, जो किसी भी विचार के उपयोगकर्ता इंटरैक्शन को स्पष्ट रूप से अक्षम करने के बिना हो सकता है।
ब्रूस पाटन

103

आईबी और स्विफ्ट

बहते हुए लेआउट को देखते हुए जहां पीला सुपरवाइव होता है और लाल, हरा और नीला, पीले रंग के उप-साक्षात्कार होते हैं,

दृश्य - शीर्ष पर लाल दृश्य

लक्ष्य एक सबव्यू (हरे रंग का कहना है) को शीर्ष पर ले जाना है।

दृश्य - शीर्ष पर हरा दृश्य

इंटरफ़ेस बिल्डर में

इंटरफ़ेस बिल्डर में आपको जो कुछ भी करने की ज़रूरत है उसे वह दृश्य खींचें जिसे आप दस्तावेज़ रूपरेखा में सूची के शीर्ष पर दिखाना चाहते हैं।

इंटरफ़ेस बिल्डर में विचारों का क्रम

वैकल्पिक रूप से, आप दृश्य का चयन कर सकते हैं और फिर मेनू में संपादक> अरेंज> सेंड टू फ्रंट पर जाएं

स्विफ्ट में

इस कार्यक्रम को करने के लिए अलग-अलग तरीके हैं।

विधि 1

yellowView.bringSubviewToFront(greenView)
  • यह विधि ऊपर दिए गए आईबी उत्तर के प्रोग्रामेटिक समकक्ष है।

  • यह केवल तभी काम करता है जब साक्षात्कार एक-दूसरे के भाई-बहन हों।

  • उप-श्रेणियों की एक सरणी में निहित है yellowView.subviews। यहां, इंडेक्स से टू में bringSubviewToFrontले जाता है । इसके साथ मनाया जा सकता हैgreenView02

      print(yellowView.subviews.indexOf(greenView))

विधि 2

greenView.layer.zPosition = 1
  • यह विधि सिर्फ z- अक्ष पर परत की 3 डी स्थिति को उच्च (उपयोगकर्ता के करीब) ले जाती है। चूंकि डिफ़ॉल्ट 0अन्य सभी विचारों के लिए है, इसलिए परिणाम यह है कि जैसा greenViewदिखता है वह शीर्ष पर है। हालांकि, यह अभी सूचकांक पर बनी हुई है 0की yellowView.subviewsसरणी। यह कुछ अप्रत्याशित परिणाम पैदा कर सकता है, हालांकि, क्योंकि नल की घटनाओं जैसी चीजें अभी भी उच्चतम सूचकांक संख्या के साथ पहले दृश्य पर जाएंगी। उस कारण से, उपरोक्त विधि 1 के साथ जाना बेहतर हो सकता है।
  • यह zPositionसुनिश्चित करने के लिए CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)स्विफ्ट के पुराने संस्करणों में) सेट किया जा सकता है कि यह शीर्ष पर है।

इसके लिए धन्यवाद ... मैं यह पता लगाने की कोशिश कर 8 घंटे बिताए। पीले रंग का दृश्य .bringSubviewToFront (हरा दृश्य) पूरी तरह से काम करता है।
मिजकिता

दिलचस्प है, कंटेनर विचार इस का सम्मान नहीं करते हैं! आपको उन्हें कोड में मैन्युअल रूप से स्थानांतरित करना होगा, ऐसा लगता है।
फटी


19

यदि आप XCode के इंटरफ़ेस बिल्डर के माध्यम से ऐसा करना चाहते हैं, तो आप संपादक-> व्यवस्था के तहत मेनू विकल्पों का उपयोग कर सकते हैं। वहां आपको "सेंड टू फ्रंट", "सेंड टू बैक" आदि मिलेंगे।


क्या होगा अगर अरेंज से ऑप्शन डिसेबल हो जाएं?
mr5

9

उस दृश्य के भीतर जिसे आप शीर्ष पर लाना चाहते हैं ... (स्विफ्ट में)

superview?.bringSubviewToFront(self)

btnDOWN.superview? .bringSubview (toFront: btnDOWN)
Criss

4

यदि आप cocos2d का उपयोग कर रहे हैं, तो आप [parentView के साथ एक समस्या देख सकते हैं: ViewSubviewToFront: view], कम से कम यह मेरे लिए काम नहीं कर रहा था। जो दृश्य मैं सामने लाना चाहता था, उसे सामने लाने के बजाय, मैं अन्य विचारों को वापस भेजता हूं और इसने यह चाल चली।

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

2

हम ios में zPosition का उपयोग कर सकते हैं

अगर हमारे पास एक दृश्य है जिसका नाम SalonDetailView उदाहरण है:@IBOutlet weak var salonDetailView: UIView!

मेरे मामले में छवि देखें

और GMSMapView के लिए UIView उदाहरण के लिए:@IBOutlet weak var mapViewUI: GMSMapView!

MapViewUI के ऊपरी भाग का सैलूनडेलटेल व्यू देखें

नीचे के रूप में zPosition का उपयोग करें

salonDetailView.layer.zPosition = 1

कृपया अपने उत्तर में सीधे यहां फ़ोटो और कोड पोस्ट करें, ताकि ओपी के लिए इसे प्राप्त करना आसान हो सके।
skratchi.at

एक शुरुआत के रूप में, StackOverflow मुझे उस खेद को करने की अनुमति नहीं देगा। आप समस्या की छवि देख सकते हैं i.stack.imgur.com/d9Cx3.png
abhijith k

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