আমি কীভাবে আইওএস এ প্রোগ্রাম অ্যাসপেক্ট রেশিও বাধা নির্ধারণ করতে পারি?


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

তবে আমার সমস্যাটি হ'ল এটি বাম এবং ডান পাশের ব্যবধানটি পরিচালনা করার সময় উচ্চতা স্থির হওয়ার পরে এটি আইফোন 6 এবং 6 প্লাসে প্রসারিত হচ্ছে। আমি কীভাবে স্ক্রিনের আকার অনুযায়ী আকার বাড়াতে পারি? আমি মনে করি এটি অনুপাতের অনুপাত হতে পারে তবে আমি কীভাবে কোডে অনুপাতের সীমাবদ্ধতা সেট করতে পারি?


4
: এই উত্তর চেক stackoverflow.com/a/12526630/3202193
আশিস Kakkad

উত্তর:


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))

এটি আমাকে এই ত্রুটিটি বাতিল করে দিয়েছিল 'এনএসআইটার্নাল ইন্সেস্টিনিস এক্সেক্সেশন' ব্যতীত ব্যতিক্রমের কারণে অ্যাপ্লিকেশনটি সমাপ্তি, কারণ: 'গুণক সীমাবদ্ধ নয়! এটা অবৈধ। গুণক: নান '
আইআরডি

4
এটি দৃশ্যে বোঝা যাচ্ছে যদি উচ্চতা 100 এবং প্রস্থ 200 হয় এবং আপনি আমার কোড দিয়ে গুণক 0.5 প্রদান করেছেন তবে আপনার উচ্চতা যদি অন্য কোনও প্রতিবন্ধকতা পরিবর্তন করে 150 এ উন্নীত হয় তবে প্রস্থটি স্বয়ংক্রিয়ভাবে 300 এ উন্নীত হবে But তবে এটি করার জন্য আপনার প্রয়োজন প্রস্থ বা উচ্চতার মতো দৃশ্যের এক সীমাবদ্ধতা বাড়ানো।
মহেশ অগ্রবাল

4
এটি উচ্চতা নেবে: প্রস্থ = 1: 2 যা 0.5 হয়।
মহেশ অগ্রবাল

4
প্রোগ্রামক্রমে কোনও প্রতিবন্ধকতা স্থাপনের আগে এই লাইনটি যুক্ত করতে ভুলবেন না: [self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
অতুলখত্রি

4
সীমাবদ্ধতাগুলি ব্যবহার করার সময়, আমার ফ্রেমের আকারগুলি সমস্ত শূন্য ছিল। দিক অনুপাত পেতে, পরিবর্তে, আমি ব্যবহার করেছিself.yourview.intrinsicContentSize
ফিলিপ্পি বোসম্যান

89

কর্মসূচিগতভাবে সীমাবদ্ধতা নির্ধারণের জন্য লেআউট অ্যাঙ্কার্স সবচেয়ে সুবিধাজনক উপায় out

বলুন যে আপনি আপনার বোতামটির জন্য 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))

4
আইওএস 8 এবং ততোধিকের জন্য আপনার অ্যাডকন্ট্রেন্ট (:) কল করার পরিবর্তে এনএসএলআউটকন্ট্রেন্টের আইসটিভ সম্পত্তিটি ব্যবহার করা উচিত। aspectRatioConstraint.isActive = true
dvdblk

আপনি কেন .widthপ্রথম বৈশিষ্ট্য হিসাবে ব্যবহার করবেন না ? ফলাফলটি হল attr2 * multiplier , অনুপাতের অনুপাতটি width / height, সুতরাং width = height * aspectRatio, আমরা যদি .heightপ্রথম গুণকে এবং তারপরে এর পরে aspectRatioরাখি multiplierতবে ফলাফলটি সম্পূর্ণ বিপরীত হয়।
কিমি চিউ

13

আপনি ইন্টারফেস বিল্ডারে ডিজাইন-সময়ে "উচ্চতা সীমাবদ্ধতা" সেট করতে পারেন। কেবল "" বিল্ড টাইম এ সরান "পরীক্ষা করে দেখুন এবং অ্যাপটি কখন চলবে তা সরিয়ে দেয়।

এখানে চিত্র বর্ণনা লিখুন এর পরে আপনি "অ্যাসপেক্ট রেশিও" সীমাবদ্ধতা যুক্ত করতে পারেন, উদাহরণস্বরূপ, ভিউডিডড পদ্ধতিতে।

"16: 9" এর জন্য জামাইন.আইওএস এ এটির মতো দেখাচ্ছে:

    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

ইউআইভিউতে সহায়ক সম্প্রসারণ

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)
Michał Ziobro

4
1. toItem প্যারামিটার সেট করা হয় এই প্রকৃতপক্ষে একটি মার্জিত সমাধান ধরনের ছাড়া দম্পতি হয় .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

এটি অর্জন করবে যে উদাহরণটি উদাহরণ হিসাবে অনুপাত পরিবর্তন করে না

  • উচ্চতা বা প্রস্থ স্ক্রিনে ফিট হবে এর চেয়ে বেশি
  • উচ্চতাটি কঠোরভাবে কোডড ছিল এবং তাই বিভিন্ন আকারের পর্দার সাথে মানিয়ে নিতে সক্ষম হবে না।

প্রশ্নটি ইমেজভিউ এবং এর সামগ্রী মোডের নয়, এটি স্বয়ংক্রিয় বিন্যাস এবং সীমাবদ্ধতা সম্পর্কে। ইন্টারফেস বিল্ডার থেকে আপনি অ্যাসপেক্ট রেশিও সীমাবদ্ধতা সেট করতে পারেন যা শেষে একটি গুণক সহ প্রস্থ থেকে উচ্চতার সীমাবদ্ধতা তৈরি করে।
গুণহান

@ গুহনহান প্রশ্নটি কীভাবে প্রোগ্রামটিমেটিক সেট করবেন তা সম্পর্কিত। সুতরাং এটি ইন্টারফেস বিল্ডারে সেট করতে সক্ষম হওয়া জেনে ভাল, তবে এই প্রশ্নের সাথে অপ্রাসঙ্গিক।
ভালেরিয়ানা

আমি মনে করি আপনি আগে যা বলেছিলাম তা ভুল বুঝেছি। এই প্রশ্নে, কেউ চিত্রকল্প সম্পর্কে কথা বলছে না। আইটি স্বয়ংক্রিয় বিন্যাস এবং সীমাবদ্ধতা সম্পর্কে এবং এটিকে প্রোগ্রামিকভাবে তৈরি করতে হয়। আপনি যখন এটিকে ইন্টারফেস বিল্ডারে সেট করেছিলেন তখন আমি যা বলেছিলাম তা হ'ল প্রস্থ থেকে উচ্চতার সীমাবদ্ধতা তৈরি করে। আমি আপনাকে আইবি এর মাধ্যমে এটি তৈরি করতে বলিনি। একই জিনিস প্রোগ্রামেটিক্যালি কাজের জন্য তোমার মত এটি তৈরি করতে হবে view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: aspectRatio, constant: 0), যাতে
Gunhan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.