2009-05-05 6 views
9

मैं छवियों का एक ग्रिड बना रहा हूं, और मैं शीर्ष पर शुरू होता हूं, जो पूरे स्थान पर UIImageView ऑब्जेक्ट्स बना रहा है। अब मैं चाहता हूं कि वे थोड़ी सी ओवरलैप करें, लेकिन आखिरी जो मैं आकर्षित करता हूं वे शीर्ष पर सबसे ज्यादा हैं। मैं जेड-पोजिशन प्रोग्रामेटिक रूप से सेट करना चाहता हूं, ताकि जो मैं आकर्षित करता हूं वह शीर्ष पर सबसे अधिक होगा।क्या UIImageView ऑब्जेक्ट्स की जेड-स्थिति के लिए किसी प्रकार का जेड-इंडेक्स सेट करने का कोई तरीका है?

उत्तर

14

आपने कहा कि आपने UIImageView का उपयोग किया था। UIImageView के साथ एक छवि को चित्रित करने का अर्थ है इसे प्रारंभ करना और फिर उसे कंटेनर व्यू में जोड़ना।

क्या आप इस कोड का उपयोग अपने लूप में नहीं कर सकते?

[containerView insertSubview:image atIndex:[[containerView subviews] count]] 

परिणाम यह होगा कि दृश्य पहले जोड़ा (मैं हालांकि यह अभी तक परीक्षण करने के लिए नहीं कर पाए हैं :))

+0

क्या होगा यदि सभी में एक ही अनुक्रमणिका हो? – Thanks

+1

ठीक है, वे एक उदाहरण के लिए एक एट इंडेक्स 0 जोड़ने के बाद से नहीं कर सकते हैं, स्टैक में अन्य सभी को टक्कर देता है। – ullmark

3

सीधे नहीं।

एक समाधान UIViews को एक जेड-इंडेक्स संपत्ति दे रहा है; एक गहराई स्तर को परिभाषित करने वाला एक पूर्णांक। फिर आप एक एनएसएआरएआरई (myArray) के माध्यम से बदल सकते हैं जिसमें UIViews उन्हें गहराई के क्रम में सबव्यू के रूप में जोड़ते हैं।

2

दरअसल, जहां तक ​​मुझे पता है, उसके लिए कोई जेड-इंडेक्स स्थिति संपत्ति नहीं है। दृश्य में चित्रण एक साधारण ड्राइंग मॉडल का उपयोग करता है।

आप या तो अपने तर्क को ड्रॉइंग लूप (यानी उन चीज़ों को आकर्षित कर सकते हैं जिन्हें आप शीर्ष पर चाहते हैं) या आप कोको एनीमेशन का उपयोग कर सकते हैं, क्योंकि UIImageView के विपरीत, कैलायर्स की गहराई होती है (वे 3 डी स्पेस का 2 डी प्रोजेक्शन हैं)। संदर्भ के लिए here देखें।

+0

हाँ, मैं हर UIImageView सोचा तरह का एक CALayer पर आधारित है? – Thanks

+0

हां, इसके बारे में सोचने के लिए आओ, आईफोन में सभी विचार परत समर्थित हैं। थोड़ा खोदने के बाद, मुझे UIImageView दस्तावेज़ों में निम्न विधियां मिलीं: - insertSubview: उपरोक्त दृश्य: - सम्मिलित करें दृश्य: नीचे सबव्यूव: – Hejazzman

19

बजाय का उपयोग कर insertSubiew आप दृश्य ढेर के शीर्ष पर है कोशिश कर सकते हैं:

- (void)bringSubviewToFront:(UIView *)view 
- (void)sendSubviewToBack:(UIView *)view 
+0

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

1

आप वास्तव में UIImageView ऑब्जेक्ट्स के बजाय कैलियर का उपयोग करने पर विचार करना चाहेंगे। UIImageView ऑब्जेक्ट्स बहुत अच्छे हैं लेकिन तीव्र ड्राइंग के लिए कैलियर हल्का वजन और अधिक कुशल है (हालांकि यदि आपको छवियों के साथ एक उपयोगकर्ता के साथ बातचीत करने की आवश्यकता है, तो एक दृश्य वस्तु बेहतर है)। यह वास्तव में निर्भर करता है कि आप क्या कर रहे हैं। कैलियर के पास एक zPosition संपत्ति है। यह यूआईकिट उपयोग करता है जब यह दृश्य स्टैक में UIView की स्थिति व्यवस्थित करता है।

3

मुझे एक ही समस्या थी। मुझे उच्चतम और निम्नतम जेड-इंडेक्स के साथ सबव्यू तत्व की आवश्यकता थी। मेरे परीक्षण से मुझे पता चला कि UIKit उप-दृश्यों में गुणों को उनके z-position के अनुसार व्यवस्थित करता है। उदाहरण के लिए यदि आप [self.scrollview subviews] लेते हैं। पहला सरणी तत्व सबव्यूव है जो बहुत पीछे है। उच्चतम सूचकांक वाला सरणी तत्व बहुत आगे के सबव्यूव है। यदि आप

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

का उपयोग करते हैं तो सबव्यूज़ सरणी को तदनुसार फिर से किया जाएगा।

3

आप नीचे दिए गए देखने के लिए रेफरी है/ऊपर आप उप दृश्य का उपयोग कर सकते जोड़ने की जरूरत है

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>]; 
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>]; 
6

https://stackoverflow.com/a/4631895/2482283

निम्नलिखित आप की zPosition संपत्ति का उपयोग कर सकते दृश्य की जेड-इंडेक्स को बदलने के लिए व्यू की परत (यह एक कैलियर ऑब्जेक्ट है)।

theView.layer.zPosition = 1; 

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

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

#import "QuartzCore/QuartzCore.h" 

एक और तरीका (https://stackoverflow.com/a/4663526/2482283), आप भी विधि UIViews उपयोग कर सकते हैं:

@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; 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^