मैं iOS में प्रोग्राम अनुपात को पहलू अनुपात में कैसे निर्धारित कर सकता हूं?


85

मैंने अपने दृश्य नियंत्रकों के लिए ऑटो लेआउट का उपयोग किया है। मैंने बाधाओं में वी और एच पदों को निर्धारित किया है, लेकिन मैं जानना चाहता हूं कि 5, 6 और 6 प्लस में बदलने पर मैं अपने बटन का आकार कैसे बढ़ा सकता हूं। इस तरह मैंने लॉगिन बटन के लिए बाधाओं को जोड़ा:

NSArray *btncon_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnLogin(40)]" options:0 metrics:nil views:viewsDictionary];
[btnLogin addConstraints:btncon_V];

NSArray *btncon_POS_H=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[btnLogin]-100-|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_H];


NSArray *btncon_POS_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[Title]-130-[lblFirst]-0-[lblSecond]-20-[textusername]-10-[txtpassword]-10-[btnLogin]" options:0 metrics:nil views:viewsDictionary];

[self.view addConstraints:btncon_POS_V];

लेकिन मेरी समस्या यह है कि जब यह बाईं और दाईं ओर खाई का प्रबंधन करता है, तो ऊंचाई तय होने के बाद से यह iPhone 6 और 6 प्लस में फैला हुआ है। मैं स्क्रीन आकार के अनुसार आकार कैसे बढ़ा सकता हूं? मुझे लगता है कि यह पहलू अनुपात हो सकता है, लेकिन मैं कोड में पहलू अनुपात की बाधा कैसे निर्धारित कर सकता हूं?


2
इस उत्तर की जाँच करें: stackoverflow.com/a/12526630/3202193
आशीष कक्कड़

जवाबों:


84

इस प्रकार सं। एक बार ट्राई करें।

[self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.yourview addConstraint:[NSLayoutConstraint
                                  constraintWithItem:self.yourview
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:self.yourview
                                  attribute:NSLayoutAttributeWidth
                                  multiplier:(self.yourview.frame.size.height / self.yourview.frame.size.width)
                                  constant:0]];

या आप के स्थान पर (self.yourview.frame.size.height / self.yourview.frame.size.width)किसी भी फ्लोट मूल्य का उपयोग कर सकते हैं। धन्यवाद।

स्विफ्ट 3.0 -

self.yourview!.translatesAutoresizingMaskIntoConstraints = false
self.yourview!.addConstraint(NSLayoutConstraint(item: self.yourview!,
                                          attribute: NSLayoutAttribute.height,
                                          relatedBy: NSLayoutRelation.equal,
                                          toItem: self.yourview!,
                                          attribute: NSLayoutAttribute.width,
                                          multiplier: self.yourview.frame.size.height / self.yourview.frame.size.width,
                                          constant: 0))

इसकी मुझे यह त्रुटि समाप्त करने वाले एप्लिकेशन को बिना किसी अपवाद के 'NSInternalInconsistencyException' अपवाद के कारण दे रहा है, कारण: 'गुणक परिमित नहीं है! वह अवैध है। गुणक: नैन '
IRD

2
इसका मतलब है कि अगर ऊंचाई 100 है और चौड़ाई 200 है और आपने मेरे कोड के साथ गुणक 0.5 दिया है, तो अगर किसी अन्य बाधा को बदलकर आपकी ऊंचाई 150 हो जाएगी, तो चौड़ाई अपने आप 300 हो जाएगी। लेकिन ऐसा करने के लिए आपको आवश्यकता है चौड़ाई या ऊँचाई की तरह दृश्य की एक बाधा को बढ़ाने के लिए।
महेश अग्रवाल

1
यह ऊँचाई लेगा: चौड़ाई = 1: 2 जो 0.5 है।
महेश अग्रवाल

3
किसी भी बाधा को प्रोग्रामेटिक रूप से सेट करने से पहले इस लाइन को जोड़ना न भूलें: [self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
atulkhatri

1
बाधाओं का उपयोग करते समय, मेरे फ्रेम आकार सभी शून्य थे। पहलू अनुपात प्राप्त करने के लिए, बजाय, मैं प्रयोग किया जाता हैself.yourview.intrinsicContentSize
Phlippie Bosman

88

लेआउट एंकर प्रोग्राम को व्यवस्थित रूप से स्थापित करने का सबसे सुविधाजनक तरीका है।

कहते हैं कि आप अपने बटन के लिए 5: 1 पहलू अनुपात सेट करना चाहते हैं तो आपको उपयोग करना चाहिए:

button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true

यहाँ पूर्ण कोड है:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .custom)
        button.setTitle("Login", for: .normal)
        button.backgroundColor = UIColor.darkGray

        self.view.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false

        let margins = view.layoutMarginsGuide

        button.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 20.0).isActive = true
        button.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: -20.0).isActive = true
        button.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: -20.0).isActive = true
        button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
    }

}

यहाँ ऊपर लिखे कोड के साथ परिणाम प्राप्त हुए हैं। आप देख सकते हैं कि बटन विभिन्न उपकरणों पर अपने 5: 1 पहलू अनुपात रखता है:

परिणाम दृश्य


14

स्विफ्ट 3:

yourView.addConstraint(NSLayoutConstraint(item: yourView,
                                          attribute: .height,
                                          relatedBy: .equal,
                                          toItem: yourView,
                                          attribute: .width,
                                          multiplier: 9.0 / 16.0,
                                          constant: 0))

1
IOS 8 और इसके बाद के संस्करण के लिए आपको addConstraint (:) कॉल करने के बजाय NSLayoutConstraint की isActive संपत्ति का उपयोग करना चाहिए। aspectRatioConstraint.isActive = true
DVDblk

आप .widthपहली विशेषता के रूप में उपयोग क्यों नहीं करते ? परिणाम है attr2 * multiplier पहलू अनुपात है, width / heightहै, इसलिए width = height * aspectRatio, अगर हम डाल .heightपहली विशेषता के लिए और aspectRatioकरने के लिए multiplierतो परिणाम पूरी तरह से उलट है।
किमी चिउ

12

आप इंटरफ़ेस बिल्डर में डिज़ाइन-टाइम पर "ऊँचाई की बाधा" सेट कर सकते हैं। बस '' निर्माण समय पर निकालें '' की जाँच करें, और जब ऐप चल रहा हो तब इसे हटा दें।

यहां छवि विवरण दर्ज करें उसके बाद आप "पहलू अनुपात" बाधा जोड़ सकते हैं, उदाहरण के लिए, व्यूडालड विधि में।

"16: 9" के लिए Xamain.iOS में यह इस तरह दिखता है:

    this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create(
            this.ImageOfTheDay,
            NSLayoutAttribute.Height,
            NSLayoutRelation.Equal,
            this.ImageOfTheDay,
            NSLayoutAttribute.Width,
            9.0f / 16.0f,
            0));

या, जैसा कि महेश अग्रवाल ने कहा:

    [self.ImageOfTheDay addConstraint:[NSLayoutConstraint
                              constraintWithItem:self.ImageOfTheDay
                              attribute:NSLayoutAttributeHeight
                              relatedBy:NSLayoutRelationEqual
                              toItem:self.ImageOfTheDay
                              attribute:NSLayoutAttributeWidth
                              multiplier:(9.0f / 16.0f)
                              constant:0]];

12

UIView पर हेल्पर एक्सटेंशन

extension UIView {

    func aspectRation(_ ratio: CGFloat) -> NSLayoutConstraint {

        return NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: self, attribute: .width, multiplier: ratio, constant: 0)
    }
}

और उपयोग है:

view.aspectRation(1.0/1.0).isActive = true


और उपयोग: view.aspectRation (1.0 / 1.0)
मिशैल जियोब्रो

1
यह वास्तव में एक सुरुचिपूर्ण समाधान है जिसमें कुछ प्रकार के जोड़े होते हैं: 1. TheItem पैरामीटर 2 के .selfबजाय self2 पर सेट होता है । और टिप्पणी में उपयोग view.aspectRation(1.0/1.0).isActive = true मुझे Xcode 10.2.1 स्विफ्ट 5 में परीक्षण किया जाना चाहिए
पंकज कुलकर्णी

3

मैंने ऊपर दिए गए सभी उत्तरों की कोशिश की है, लेकिन काम नहीं किया, और यह स्विफ्ट 3 के साथ मेरा समाधान है:

let newConstraint = NSLayoutConstraint(item: yourView, attribute: .width, relatedBy: .equal, toItem: yourView, attribute: .height, multiplier: 560.0/315.0, constant: 0)
yourView.addConstraint(newConstraint)
NSLayoutConstraint.activate([newConstraint])  
NSLayoutConstraint.deactivate(yourView.constraints)
yourView.layoutIfNeeded()

ऑटोलोयट त्रुटियों से बचने के लिए नए जोड़ने से पहले आपको हमेशा (संभावित परस्पर विरोधी) बाधाओं को निष्क्रिय करना चाहिए
जॉन

0

विचारों के लिए, बाधाएं भी हैं और गुण भी हैं।

पहलू अनुपात दृश्य की एक संपत्ति है , इसलिए आप इसे सामग्री मोड का उपयोग करके सेट कर सकते हैं, जैसे

imageView.contentMode = .scaleAspectFit

उदाहरण के लिए, यदि कोई दृश्य अनुपात नहीं बदलता है , तो यह प्राप्त होगा

  • स्क्रीन पर फिट होने की तुलना में ऊँचाई या चौड़ाई अधिक होती है
  • ऊँचाई हार्ड कोडित थी और इसलिए विभिन्न आकारों की स्क्रीन के अनुकूल नहीं हो पाएगी।

प्रश्न ImageView और इसकी सामग्री मोड के बारे में नहीं है, यह ऑटो लेआउट और बाधाओं के बारे में है। इंटरफ़ेस बिल्डर से, आप पहलू अनुपात बाधा निर्धारित कर सकते हैं जो अंत में एक गुणक के साथ ऊंचाई की चौड़ाई में चौड़ाई बनाता है।
गुन्नन

@ गुंजन का सवाल है कि इसे प्रोग्रामेटिक रूप से कैसे सेट किया जाए। इसलिए इसे इंटरफ़ेस बिल्डर में सेट करने में सक्षम होने के कारण यह जानना अच्छा है, लेकिन इस प्रश्न के लिए अप्रासंगिक है।
वेलेरियाना

मुझे लगता है कि आपने पहले जो कहा था उसे गलत समझा। इस सवाल में, कोई भी ImageView के बारे में बात नहीं कर रहा है। आईटी ऑटो लेआउट और बाधाओं के बारे में है, और इसे प्रोग्रामेटिक रूप से बनाना है। जब मैंने कहा था कि जब आप इसे इंटरफ़ेस बिल्डर में सेट करते हैं तो यह ऊंचाई की चौड़ाई के लिए एक चौड़ाई बनाता है। मैंने आपको आईबी के माध्यम से इसे बनाने के लिए नहीं कहा था। एक ही बात को प्रोग्राम के ऐसा करने के लिए आप की तरह इसे बनाने के लिए है view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: aspectRatio, constant: 0)तो
Gunhan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.