2013-01-09 15 views
5

पोर्ट्रेट में शीर्ष पर 300 पिक्सेल और लैंडस्केप के दौरान शीर्ष पर लगभग 175 पिक्सेल दिखाई देने के लिए तालिका दृश्य देखना चाहते हैं।NSLayoutConstraint और पोर्ट्रेट में शीर्ष से एक्स पिक्सल और परिदृश्य में शीर्ष से वाई पिक्सल सेट करना

मुझे वीएफएल तर्क की आवश्यकता नहीं है।

उत्तर

10

कई autolayout समस्याओं की तरह, हाँ, आप क्या कह रहे हैं क्या कर सकते हैं, लेकिन यह स्पष्ट से दूर है। अगर मुझे वास्तव में 300pt या 175pt की आवश्यकता होती है, तो भी, मैं घूर्णन पर शीर्ष बाधा को समायोजित करने के लिए प्रेरित हो सकता हूं।

लेकिन क्या आप जानते हैं कैसे रोटेशन घटनाओं से निपटने के बिना ऐसा करना चाहते हैं तो आप:

  1. सेट 175 के लिए आवश्यक न्यूनतम ऊपरी हाशिया;

  2. 300 की निम्न प्राथमिकता पसंदीदा शीर्ष मार्जिन सेट करें (जो परिदृश्य में संतुष्ट नहीं होगा); और

  3. कम स्पष्ट रूप से, आपको एक न्यूनतम न्यूनतम ऊंचाई भी चाहिए (ताकि परिदृश्य में, यह शीर्ष मार्जिन 300 बनाने के लिए निम्न प्राथमिकता अनुरोध को पूरा न करने के बारे में पता चलेगा)। के साथ संयुक्त

    @"V:|-(>=175)-[tableView(>=120)]-5-|" 
    

    :

आप, उदाहरण के लिए, इस्तेमाल कर सकते हैं (जाहिर है जो कुछ भी आप के लिए समझ में आता है के साथ 5 की मेरी निचला हाशिया की जगह है, लेकिन उसके अनुसार tableview की न्यूनतम ऊंचाई को समायोजित):

@"V:|-([email protected])-[tableView]" 

(जाहिर है, आप क्षैतिज अक्ष के लिए बाधाओं को भी होता है, लेकिन मैं संक्षिप्तता की खातिर उन छोड़ देते हैं।)

0,123,

यह स्वीकार्य रूप से, न्यूनतम तालिका ऊंचाई को सटीक रूप से निर्दिष्ट करने के लिए, अस्पष्ट रूप से अपरिहार्य है, लेकिन मैंने ऑटोलायआउट को यह बताने का कोई और तरीका नहीं देखा कि किस स्थिति में इसे 300pt के वैकल्पिक शीर्ष स्थान को संतुष्ट नहीं किया जाना चाहिए।


तुम भी y = mx + bconstraintWithItem के सूत्र का उपयोग कर के साथ ऐसा कर सकते हैं।हाँ, मैं आप कैसे दृश्य स्वरूप भाषा के साथ ऐसा करने के लिए कहा है, लेकिन अगर आप constraintWithItem उपयोग करते हैं, आप कम से कम तालिका ऊंचाई निर्दिष्ट करने के लिए नहीं है, बल्कि तुम सिर्फ ऊपरी हाशिया की तरह तो सेट कर सकते हैं:

constraint = [NSLayoutConstraint constraintWithItem:self.tableView 
              attribute:NSLayoutAttributeTop 
              relatedBy:NSLayoutRelationEqual 
              toItem:self.tableView.superview 
              attribute:NSLayoutAttributeBottom 
             multiplier:multiplier 
              constant:constant]; 

स्पष्ट रूप से, चाल multiplier और constant निर्धारित करने का तरीका है ताकि आपको चित्र में 300 pt और परिदृश्य में 175 pt प्राप्त हो। ,

CGFloat multiplier = (300.0 - 175.0)/(superviewPortraitHeight - superviewLandscapeHeight); 
CGFloat constant = 175.0 - superviewLandscapeHeight * multiplier; 

फिर से (और,, मैं मान लेंगे कि आप अन्य बाधाओं ताकि tableview अस्पष्ट से परिभाषित नहीं है निर्दिष्ट करेंगे: एक छोटे से बीजगणित कर रही है, आपको लगता है कि आप उन मूल्यों को इस प्रकार की गणना कर सकते देखेंगे उदाहरण के लिए बाएं, दाएं, और नीचे की बाधाओं को सेट करें, जो विजुअल प्रारूप भाषा में किया जा सकता है।)

+0

बहुत बढ़िया, बाधा WithItem सही काम करता है। यह कुछ समझ में आता है और इसे अन्य स्थानों का उपयोग करने में सक्षम होना चाहिए जहां मुझे वही काम करने की आवश्यकता होगी। मुझे लगता है कि मैं इसे बाधाओं के साथ करना चाहता था क्योंकि यह मेरी समझ की बाधाओं को घुमावदार अभिविन्यास प्रतिनिधि (जैसे रेडेलर सुझाए गए) का उपयोग करने की आवश्यकता को प्रतिस्थापित करने के लिए माना जाता है? – Padin215

+0

@ लॉग 139 हाँ, लंबे समय तक, ऐप्पल चाहता है कि डेवलपर्स किसी डिवाइस के अभिविन्यास के बजाए पर्यवेक्षण के 'सीमाओं 'पर तर्कसंगत तर्क पर ध्यान केंद्रित करें। लेकिन मेरे हिस्से का आश्चर्य है कि ऑटोटायआउट वास्तव में प्राइमटाइम के लिए तैयार है या नहीं। यह बहुत जटिल है। वीएफएल में कुछ उल्लेखनीय कमीएं हैं। ऑटोलायआउट और डिवाइस और अभिविन्यास-विशिष्ट डिजिटल संपत्तियों की लचीलापन के बीच एक संज्ञानात्मक विसंगति भी है। मैं आपके उत्साह के लिए आपकी टोपी को टिपता हूं, लेकिन मेरे लिए, जूरी अभी भी बाहर है। व्यक्तिगत रूप से मैं उपरोक्त कोड को पारंपरिक दृष्टिकोणों में सुधार के रूप में घोषित करने में संकोच करता हूं। – Rob

+0

यह नहीं होना चाहिए @ @ "वी: | - (> = 175) - [tableView (> = 120)] - 5- |" '? –

3

मुझे नहीं लगता कि यह रोटेशन कॉलबैक विधि में कोड में इसे बदले बिना विशिष्ट दूरी को करने के लिए इसे सेट करने के लिए वैसे भी है। यदि आप आईबी में बाधा के लिए आईबीओटलेट बनाते हैं (इसे इसे con1 कहते हैं), और 300 के शुरुआती मूल्य के साथ उस बाधा है, तो एक रोटेशन कॉलबैक विधि में आप बस उस स्थिर को बदल सकते हैं।

self.con1.constant = 175;

संपादित करने के बाद:

इस काम करता है:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     con1.constant = 175; 
    }else{ 
     con1.constant = 300; 
    } 
} 
+0

क्या प्राथमिकताओं के साथ किया जा सकता है? – Padin215

+0

@ लॉग 139, मुझे लगता है कि आप इसे इस तरह के शीर्ष पर ले जा सकते हैं, लेकिन मुझे नहीं पता कि आप उस सटीक संख्या (175) को प्राप्त कर सकते हैं या नहीं। यदि आपके ऊपर और नीचे दोनों के लिए बाधा है, और शीर्ष को कम प्राथमिकता दें, तो यह उच्च प्राथमिकता दूरी (नीचे तक) रखेगा, और जब आप घूमते हैं तो शीर्ष को दूरी कम करें। यदि आपके विचार की ऊंचाई सही है, तो वह दूरी 175 हो सकती है। – rdelmar

+0

मैं थोड़ी सी सोच रहा था, लेकिन मुझे यकीन नहीं है कि मैं तर्क कैसे स्थापित करूंगा। – Padin215