ऑटोलैयूट का उपयोग करके कुल चौड़ाई का प्रतिशत कैसे बनाएं?


114

मुझे कुल चौड़ाई का एक निश्चित प्रतिशत के साथ तीन गतिशील कॉलम बनाने की आवश्यकता है। तिहाई नहीं, लेकिन अलग-अलग मूल्य। उदाहरण के लिए, निम्नलिखित दृष्टांत तीन स्तंभ दिखाता है: पहला 42% चौड़ा, दूसरा 25% चौड़ा और तीसरा 33% चौड़ा है।

व्यूकंट्रोलर में 600 पिक्सेल के लिए, क्रमशः 252, 150 और 198 पिक्सेल होंगे।

हालाँकि, किसी भी बाद के डिस्प्ले साइज़ (यानी आईफोन 4 लैंडस्केप (960 वाइड) या आईपैड 2 पोर्ट्रेट (768 वाइड) के लिए, मैं चाहूंगा कि सापेक्ष प्रतिशत एक समान हो (ऊपर उद्धृत पिक्सल नहीं)।

वहाँ Storyboards (यानी कोड के बिना) का उपयोग करने का एक तरीका है? मैं इसे आसानी से कोड में कर सकता हूं, लेकिन मेरा लक्ष्य स्टोरीबोर्ड में इस डिस्प्ले लॉजिक का अधिक से अधिक उपयोग करना है।

यहां छवि विवरण दर्ज करें

जवाबों:


205

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

  1. एक दृश्य और उसके पर्यवेक्षण दोनों का चयन करें।

  2. संपादक चुनें -> पिन -> चौड़ाई पर्यवेक्षक की चौड़ाई के बराबर होने के लिए चौड़ाई को विवश करने के लिए (वास्तव में कैनवास के नीचे "पिन" पॉपअप संवाद यहां सबसे अच्छा काम करता है)।

  3. बाधा को संपादित करें और गुणक को वांछित अंश पर सेट करें, जैसे 0.42। और इसलिए अन्य विचारों के लिए भी।


9
सुनिश्चित करें कि आप जिस दृश्य को विवश कर रहे हैं, वह समान चौड़ाई की समरूपता के "प्रथम मद" में प्रकट होता है, न कि पर्यवेक्षण की चौड़ाई का, अन्यथा आप अपने सबव्यू की चौड़ाई को गुणांक की चौड़ाई से गुणा कर रहे हैं। जब नियंत्रण-खींचने से सब-वे के लिए एक सब-वे से बराबर चौड़ाई की बाधा को लागू करने के लिए ये हमेशा उलट होते हैं, जो मुझे प्रति-सहज लगता है।
मेमों

आह - "इसे कोड में कर" से मेरा मतलब कुछ और था जैसे "मैन्युअल रूप से, बिना बाधा या ऑटोलेआउट"।
जेफरी बर्थियाउम

अच्छा उत्तर। मुझे आश्चर्य है कि आईबी इस बाधा को संपादित करने का एक तरीका नहीं प्रदान करता है।
वॉचक्रैन

मैंने अपने UITableViewCell में इसे लागू करने की कोशिश की और सब कुछ धूसर हो गया। मुझे अपने सभी विचारों को एक नए दृश्य में एम्बेड करना था और अपने लेबल से इस नए दृश्य में समान रूप से चौड़ाई का चयन करना था। आशा करता हूँ की ये काम करेगा।
नैनो

6
Xcode7 में नया: यदि आप समान रूप से संरेखित करना चाहते हैं तो नए "स्टैक व्यू" का उपयोग करें।
बिजन

15

जैसा कि Apple ने UIStackView पेश किया है, इसने काम को बहुत आसान बना दिया है।

विधि 1: Nib / StoryBoard का उपयोग करना:

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

Xcode View संपादक in। StackView में एम्बेड करें

यहां छवि विवरण दर्ज करें

स्टैक व्यू का चयन करें और सुरक्षितता के साथ अग्रणी, अनुगामी, शीर्ष और समान ऊंचाई के साथ बाधा दें

गुण निरीक्षक क्षेत्र और के लिए क्लिक करें सेट StackView क्षैतिज और वितरण आनुपातिक को भरने के लिए

[ यहां छवि विवरण दर्ज करें

पक्षों के साथ अग्रणी, अनुगामी, शीर्ष, नीचे के साथ तीन दृश्य का अवरोध दें। यहां छवि विवरण दर्ज करें

विधि 2: प्रोग्रामेटिक रूप से:

import UIKit
class StackViewProgramatically: UIViewController {
    var propotionalStackView: UIStackView!
    ///Initially defining three views
    let redView: UIView = {
        let view = UIView()//taking 42 % initially
        view.frame = CGRect(x: 0, y: 0, width: 42 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .red
        return view
    }()

    let greenView: UIView = {
        let view = UIView()//taking 42* initially
        view.frame = CGRect(x: 42 * UIScreen.main.bounds.width/100, y: 0, width: 25 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .green
        return view
    }()
    let blueView: UIView = {
        let view = UIView()//taking 33*initially
        view.frame = CGRect(x: 67 * UIScreen.main.bounds.width/100, y: 0, width: 33 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .blue
        return view
    }()

    ///Changing UIView frame to supports landscape mode.
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        DispatchQueue.main.async {
            self.redView.frame = CGRect(x: 0, y: 0, width: 42 * self.widthPercent, height: self.screenHeight)
            self.greenView.frame = CGRect(x: 42 * self.widthPercent, y: 0, width: 25 * self.widthPercent, height: self.screenHeight)
            self.blueView.frame = CGRect(x: 67 * self.widthPercent, y: 0, width: 33 * self.widthPercent, height: self.screenHeight)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        //Adding subViews to the stackView
        propotionalStackView = UIStackView()
        propotionalStackView.addSubview(redView)
        propotionalStackView.addSubview(greenView)
        propotionalStackView.addSubview(blueView)
        propotionalStackView.spacing = 0
        ///setting up stackView
        propotionalStackView.axis = .horizontal
        propotionalStackView.distribution = .fillProportionally
        propotionalStackView.alignment = .fill
        view.addSubview(propotionalStackView)
    }
}
//MARK: UIscreen helper extension
extension NSObject {

    var widthPercent: CGFloat {
        return UIScreen.main.bounds.width/100
    }

    var screenHeight: CGFloat {
        return UIScreen.main.bounds.height
    }
}

आउटपुट:

परिदृश्य और चित्र के साथ काम करता है

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

डेमो प्रोजेक्ट - https://github.com/janeshsutharios/UIStackView-with-constraints

https://developer.apple.com/videos/play/wwdc2015/218/


4

मुझे लगता है कि इसे और अधिक विस्तार से समझाया जा सकता है, इसलिए किसी पर्यवेक्षण के भीतर निश्चित प्रतिशत लेआउट की आवश्यकता वाले किसी भी दृश्य पर इसे अधिक आसानी से लागू किया जा सकता है।

वाम-सर्वाधिक दृश्य

  • के लिए लंगर लगाया गया SuperView.Leading
  • पर एक गुणक के रूप में अपने निश्चित प्रतिशत को परिभाषित करता है SuperView.Height

मध्यवर्ती विचार

  • पर एक गुणक के रूप में अपने निश्चित प्रतिशत को परिभाषित करता है SuperView.Height
  • leftअपने पड़ोसी के अधिकार के लिए इसे पिन करता है

राइट-मोस्ट व्यू

  • एक निश्चित प्रतिशत परिभाषित नहीं करता है (यह उपलब्ध दृश्य का शेष है)
  • leftअपने पड़ोसी के अधिकार के लिए इसे पिन करता है
  • इसके rightलिए पिनSuperView.Trailing

सभी दृश्य

  • Top Layout Guide.Topऔर एंकरिंग करके अपनी गैर-निर्धारित ऊंचाइयों को परिभाषित करें Top Layout Guide.bottom। ऊपर दिए गए उत्तर में, यह ध्यान दिया गया है कि यह पड़ोसी दृश्य के बराबर ऊंचाई सेट करके भी किया जा सकता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.