2011-03-03 15 views
5

मेरा वर्तमान डिज़ाइन डेटा के चित्र और परिदृश्य दृश्यों के बीच कुछ शांत एनीमेशन के लिए कॉल करता है। डेटा प्रतिनिधित्व काफी जटिल है, इसलिए ग्राफिकल और डेटा तत्वों के बीच, स्क्रीन पर लगभग 30 बटन और लेबल एक बार में होते हैं। मैंने एक बहुत कसकर डिजाइन किया इंटरफेस बनाया है ... अब मैं लैंडस्केप व्यू के लिए तत्वों को बिछा रहा हूं। एक ही रास्ता मैं अब तक यह करने के लिए मिल गया है वास्तव में उदाहरण के लिए, कोड में लैंडस्केप दृश्य बाहर रखना है:इंटरफ़ेस बिल्डर में वास्तव में * दृश्यमान डिज़ाइन * जुड़वां विचार (परिदृश्य + चित्र) के लिए कोई तरीका है?

-(void) positionViews { 
    UIInterfaceOrientation destOrientation = self.interfaceOrientation; 
    if (destOrientation == UIInterfaceOrientationPortrait || destOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     //---if rotating into PORTRAIT mode 
     timeBGbox.frame = CGRectMake(14, 88, 134, 14); 
     targetTime.frame = CGRectMake(0, 99, 150, 29); 
     energyBGbox.frame = CGRectMake(156, 88, 68, 14); 
     targetEnergy.frame = CGRectMake(154, 99, 70, 29); 
     speedBGbox.frame = CGRectMake(234, 88, 68, 14); 
     targetSpeed.frame = CGRectMake(226, 99, 48, 29); 
     speedLabel.frame = CGRectMake(264, 99, 40, 36); 
    } else { 
     //---if rotating to LANDSCAPE mode 
     timeBGbox.frame = CGRectMake(156, 12, 152, 14); 
     targetTime.frame = CGRectMake(160, 23, 150, 29); 
     energyBGbox.frame = CGRectMake(156, 50, 68, 14); 
     targetEnergy.frame = CGRectMake(154, 61, 70, 29); 
     speedBGbox.frame = CGRectMake(234, 50, 74, 14); 
     targetSpeed.frame = CGRectMake(228, 61, 48, 29); 
     speedLabel.frame = CGRectMake(269, 61, 40, 36); 
    } 
} 

यह एक श्रमसाध्य प्रक्रिया है कई परीक्षणों लेने पूरा करने के लिए मैं क्या में नेत्रहीन कर सकता है आईबी में सेकंड वर्तमान में, जब मैं आईबी में विचारों के बीच टॉगल करता हूं, और पोर्ट्रेट पर वापस स्विच करने पर मैन्युअल रूप से लैंडस्केप मोड में तत्वों को स्थानांतरित करता हूं, तो वे गलत जगह पर होते हैं। मैंने "स्प्रिंग्स और स्ट्रेट्स" को यथासंभव रचनात्मक रूप से उपयोग किया है, लेकिन मेरे अधिकांश तत्वों को ऑटोसाइजिंग के दायरे से परे सटीक मैन्युअल प्लेसमेंट की आवश्यकता है।

मेरा प्रश्न है: वहाँ आईबी को सक्षम बनता है कि दृश्य लेआउट उपकरण का उपयोग कर एक दृश्य के दो चित्रमय लेआउट के विकास के भीतर एक टॉगल मोड है, या संख्यात्मक कोड एक ही रास्ता है?

उत्तर

3

आप अपनी निब फ़ाइल में मनमाने ढंग से विचारों को बना सकते हैं। आप उनमें से एक को "पोर्ट्रेट व्यू" कह सकते हैं (कहें, वह जिसे फ़ाइल के मालिक के "व्यू" आउटलेट तक भी लगाया जाता है), और उनमें से एक "लैंडस्केप व्यू"। उन दोनों को अपने UIViewController वर्ग में दुकानों के रूप में परिभाषित करें:

@property (nonatomic, retain) IBOutlet UIView *portraitView; 
@property (nonatomic, retain) IBOutlet UIView *landscapeView; 

के रूप में आप की तरह आईबी में फ़ील्ड करना।

@property (nonatomic, retain) IBOutlet UIView *myLabel_portrait; 
@property (nonatomic, retain) IBOutlet UIView *myLabel_landscape; 

और अपने कोड में आप तारीख तक दोनों संस्करणों रखने की जरूरत है: चाल तो है कि आप अपने हेडर फाइल में दुकानों दोगुनी की जरूरत है। सबसे अच्छा यह है कि आप उनमें से किसी एक को अपडेट करते समय बस अपडेट करें।

फिर autorotate करने के लिए कोड, वास्तव में आसान है बस:

if (switchingToPortrait) 
    self.view = self.portraitView; 
else 
    self.view = self.landscapeView; 
+2

+1। इसमें कमी है कि तत्व एनीमेशन के साथ नई स्थिति में फिर से नहीं बदलते हैं, आप केवल पूरे विचारों के बीच संक्रमण को एनिमेट कर सकते हैं। – zoul

+1

मैं इसे तीसरे दृश्य के साथ करता हूं, और कोड में सभी तत्वों को "अस्थायी" घूर्णन दृश्य पर चित्र दृश्य के फ्रेम का उपयोग करके, फिर परिदृश्य दृश्य की स्थिति को एनिमेट करते हैं। यह अभी भी तकनीक का उपयोग करता है I desribe, यह सिर्फ उस पर फैलता है। सुविधा के लिए आप अभी भी आईबी में लैंडस्केप मोड लेआउट कर सकते हैं। – Bogatyr

+0

धन्यवाद Bogatyr ... स्पष्टीकरण के लिए: क्या आप कह रहे हैं कि मुझे हर लेबल और बटन को संबोधित करने की आवश्यकता है _portrait और _landscape संस्करण दोनों की आवश्यकता है? तो मूल रूप से मेरे कोड में मैं एक साथ 2 विचार अपडेट करूँगा? – AcroYogi

0

AFAIK इंटरफ़ेस बिल्डर में ऐसा करने का कोई तरीका नहीं है। चूंकि विचार nib फ़ाइल से तत्काल हैं, फिर भी आप दो उदाहरणों के साथ समाप्त हो जाएंगे।

डेवलपर दस्तावेज़ों में बताया गया है कि आप लेआउटस्यूब्यूव्यू का उपयोग कर सकते हैं, या अपने दृश्य नियंत्रक में बस एक कस्टम विधि का उपयोग कर सकते हैं जैसे आपके पास है।

1

सबसे अच्छा मैं सोच सकता हूं कि दो विचार हैं, और उन्हें didRotateFromInterfaceOrientation: में स्विच करें।

0

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