প্রোগ্রাম্যিকভাবে বিন্যাস সীমাবদ্ধতা তৈরি করা


84

আমি জানি যে ইতিমধ্যে প্রচুর লোকেরা এই সম্পর্কে অনেকগুলি প্রশ্ন জিজ্ঞাসা করেছেন, তবে উত্তরগুলি দিয়েও আমি এটি কার্যকর করতে পারি না।

আমি যখন স্টোরিবোর্ডে বাধা নিয়ে কাজ করি তখন সহজ তবে কোডে আমার খুব কষ্ট হয়। উদাহরণস্বরূপ, আমি এমন দৃশ্য দেখার চেষ্টা করি যা ডানদিকে থাকে এবং স্ক্রিনের ওরিয়েন্টেশন অনুযায়ী পর্দার উচ্চতা থাকে। এটি আমার কোড:

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 748)];
myView.backgroundColor = [UIColor redColor];
[self.view addSubview:myView];
[self.view addConstraints:[NSLayoutConstraint
    constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
    options:0 metrics:nil
    views:NSDictionaryOfVariableBindings(myView)]];

এটি কিছু প্রতিবন্ধকতা পূরণ করে না। আমি কি দেখছি ভুল নেই। এছাড়াও, আমি কেন self.myViewস্থানীয় ভেরিয়েবলের মতো কোনও সম্পত্তি ব্যবহার করতে পারি না myView?


উপরের কোডটিতে ভিভি কী?
আইডিএভ

14
দয়া করে শিরোনামটি "আইওএস" এর পরিবর্তে "আইওএস" এ পরিবর্তন করুন - পরেরটিটি সিসকোর সুইচ / রাউটার অপারেটিং সিস্টেমকে বোঝায়। আমাকে বিভ্রান্ত। ধন্যবাদ
আরমানি

4
এ সম্পর্কে বেশ কয়েকটি প্রশ্ন: (1) "কিছু সীমাবদ্ধতা পূরণ না করে" আপনি কী ত্রুটি পেয়ে যাচ্ছেন? (২) আপনি কি সীমাবদ্ধতায় স্বয়ংক্রিয়করণ অনুবাদ করছেন myView? (৩) কী vivi(যেমন এসিবি জিজ্ঞাসা করেছিল)? (4) আপনার কি কোনও সম্পত্তি myViewঘোষিত আছে self?
টিম

4
আমি টিম, ভিভি'র জন্য দুঃখিত, আমি খুব দ্রুত ট্যাপ করেছি ... এটি আমার ভিউ। অনুবাদ করে আপনি কী বোঝাতে চান? আমি যা করি তা উপরের কোডে রয়েছে। সম্পত্তি সম্পর্কে, আমার কাছে আরও কিছু মতামত রয়েছে যা সম্পত্তি হিসাবে ঘোষণা করা হয় তবে আমি যখন সেই সম্পত্তিটিতে একই কোডটি প্রয়োগ করি তখন এটি ক্র্যাশ হয়ে যায় ... "ত্রুটি" বার্তাটি সত্যিই বড়, আমি এখানে এটি
আটকানোতে

কোনও নির্দিষ্ট দর্শন থেকে সাময়িকভাবে সীমাবদ্ধতাগুলি সরিয়ে ফেলতে এই স্ট্যাকওভারফ্লো.com
স্যাম বি

উত্তর:


106

কোডে অটো লেআউট ব্যবহার করার সময় ফ্রেম সেট করা কিছুই করে না। সুতরাং উপরোক্ত দৃশ্যে আপনি 200 প্রস্থের নির্দিষ্ট করেছেন, আপনি যখন এতে সীমাবদ্ধতা সেট করেন তখন কোনও অর্থ হয় না। কোনও দৃশ্যের সীমাবদ্ধতাটি দ্ব্যর্থহীন হওয়ার জন্য, এর জন্য চারটি জিনিস দরকার: একটি এক্স-অবস্থান, একটি ওয়াই-অবস্থান, প্রস্থ এবং কোনও প্রদত্ত রাষ্ট্রের জন্য একটি উচ্চতা।

বর্তমানে উপরের কোডটিতে আপনার কেবলমাত্র দুটি (উচ্চতা, তত্ত্বাবধানের সাথে তুলনামূলকভাবে এবং y- অবস্থান, তত্ত্বাবধানের তুলনায়) রয়েছে। এগুলি ছাড়াও, আপনার কাছে দুটি প্রয়োজনীয় সীমাবদ্ধতা রয়েছে যা ভিউর সুপারভাইভের সীমাবদ্ধতা কীভাবে সেটআপ হয় তার উপর নির্ভর করে বিরোধ করতে পারে। সুপারভিউতে যদি কোনও আবশ্যক সীমাবদ্ধতা থাকে যা এটির উচ্চতা 748 এর চেয়ে কম কিছু হতে পারে তা নির্দিষ্ট করে, আপনি একটি "অসন্তুষ্ট বাধা" ব্যতিক্রম পাবেন।

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

আপনার প্রশ্নে মৌখিকভাবে বর্ণিত বিন্যাসের জন্য প্রয়োজনীয় প্রতিবন্ধকতা সেট তৈরি করতে, একটি সম্পূর্ণ নির্দিষ্ট লেআউট দেওয়ার জন্য আপনাকে প্রস্থ এবং এক্স-অবস্থানের সাথে আবদ্ধ করতে কিছু অনুভূমিক সীমাবদ্ধতা যুক্ত করতে হবে:

[self.view addConstraints:[NSLayoutConstraint
    constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
    options:NSLayoutFormatDirectionLeadingToTrailing
    metrics:nil
    views:NSDictionaryOfVariableBindings(myView)]];

[self.view addConstraints:[NSLayoutConstraint
    constraintsWithVisualFormat:@"H:[myView(==200)]-|"
    options:NSLayoutFormatDirectionLeadingToTrailing
    metrics:nil
    views:NSDictionaryOfVariableBindings(myView)]];

এই লেআউটটি ভার্চুয়ালভাবে বর্ণনা করে উল্লম্ব সীমাবদ্ধতা দিয়ে শুরু করে:

মাইভিউ তার তত্ত্বাবধানের উচ্চতাটি স্ট্যান্ডার্ড স্পেসের সমান শীর্ষ এবং নীচের প্যাডিং দিয়ে পূর্ণ করবে। মাইভিউর তত্ত্বাবধানে সর্বনিম্ন উচ্চতা 8৪৮ পিটি রয়েছে। মাইভিউয়ের প্রস্থ 200pts এবং এর তত্ত্বাবধানের বিপরীতে মান জায়গার সমান ডান প্যাডিং রয়েছে।

যদি আপনি কেবল সুপারভিউয়ের উচ্চতা সীমাবদ্ধ না করে পুরো তত্ত্বাবধানের উচ্চতা পূরণ করতে ভিউটি পছন্দ করেন তবে আপনি কেবল (>=748)ভিজ্যুয়াল বিন্যাসের পাঠ্যে প্যারামিটারটি বাদ দিতে পারেন । যদি আপনি মনে করেন যে (>=748)প্যারামিটারটি এটি একটি উচ্চতা দেওয়ার প্রয়োজন - আপনি এই উদাহরণটিতে নেই: বার ( |) বা স্পেস ( |-, -|) সিনট্যাক্স সহ বারটি ব্যবহার করে সুপারভিউয়ের প্রান্তগুলিতে ভিউটি পিনিং করছেন , আপনি নিজের দর্শনটি একটি y -পজিশন (একক প্রান্তে ভিউটি পিন করা) এবং উচ্চতা সহ একটি ওয়াই-পজিশন (উভয় প্রান্তে ভিউটি পিন করা), যাতে এই দৃশ্যের জন্য আপনার সীমাবদ্ধতাটিকে সন্তুষ্ট করে।

আপনার দ্বিতীয় প্রশ্নের ক্ষেত্রে:

ব্যবহার NSDictionaryOfVariableBindings(self.myView)(যদি আপনি myView জন্য একটি সম্পত্তি সেটআপ ছিল) এবং খাওয়ানোর আপনার VFL মধ্যে ব্যবহার করতে self.myViewআপনার VFL পাঠে, আপনি সম্ভবত একটি ব্যতিক্রম যখন স্বয়ংক্রিয়-বহির্বিন্যাস চেষ্টা আপনার VFL টেক্সট বিশ্লেষণ করতে হবে। এটি অভিধানের কীগুলিতে এবং সিস্টেমটি ব্যবহারের চেষ্টা করার ক্ষেত্রে ডট সংকেত দিয়ে কাজ করে valueForKeyPath:অনুরূপ প্রশ্ন এবং উত্তর জন্য এখানে দেখুন


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

যদিও এই উত্তরটি আমার প্রশ্নের উত্তর দেয় নি, এটি আমাকে কিছু বুঝতে সাহায্য করেছিল। সাথে থাকার জন্য ধন্যবাদ! :)
মাতেজ

4
এখন পর্যন্ত ইন্টারনেটে একমাত্র সংক্ষিপ্ত এবং পঠনযোগ্য অটো লেআউট ভূমিকা।
জো কারসন

Plz আমাকে সাহায্য আমার প্রশ্ন এই হল ... আমি প্রোগ্রামেটিক্যালি কিভাবে সীমাবদ্ধতার ব্যবহার করতে জানেন stackoverflow.com/questions/36326288/...

61

হাই, আমি এই পৃষ্ঠাটি সীমাবদ্ধতা এবং "কীভাবে" ব্যবহার করতে ব্যবহার করছি। আমার প্রয়োজনীয় উপলব্ধি করার বিন্দুতে পৌঁছাতে আমাকে চিরকাল নিয়ে গেছে:

myView.translatesAutoresizingMaskIntoConstraints = NO;

এই উদাহরণ কাজ পেতে। আপনাকে এখানে ইউজেক্সএক্সএক্স, রব এম এবং বিশেষত লার্সাকাসের ব্যাখ্যা এবং কোডের জন্য ধন্যবাদ, এটি অমূল্য হয়েছে।

রান করার জন্য উপরের উদাহরণগুলি পাওয়ার জন্য এখানে কোডটি পূর্ণ:

UIView *myView = [[UIView alloc] init];
myView.backgroundColor = [UIColor redColor];
myView.translatesAutoresizingMaskIntoConstraints = NO;  //This part hung me up 
[self.view addSubview:myView];
//needed to make smaller for iPhone 4 dev here, so >=200 instead of 748
[self.view addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"V:|-[myView(>=200)]-|"
                           options:NSLayoutFormatDirectionLeadingToTrailing
                           metrics:nil
                           views:NSDictionaryOfVariableBindings(myView)]];

[self.view addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"H:[myView(==200)]-|"
                           options:NSLayoutFormatDirectionLeadingToTrailing
                           metrics:nil
                           views:NSDictionaryOfVariableBindings(myView)]];

11

সুইফট সংস্করণ

সুইফট 3-এর জন্য আপডেট হয়েছে

এই উদাহরণটি ইন্টারফেস বিল্ডারে এটি করার মতো করে প্রোগ্রামটিকে নিম্নরূপ সীমাবদ্ধতা যুক্ত করার জন্য দুটি পদ্ধতি প্রদর্শন করবে:

প্রস্থ এবং উচ্চতা

এখানে চিত্র বর্ণনা লিখুন

ধারক মধ্যে কেন্দ্র

এখানে চিত্র বর্ণনা লিখুন

বয়লারপ্লেট কোড

override func viewDidLoad() {
    super.viewDidLoad()

    // set up the view
    let myView = UIView()
    myView.backgroundColor = UIColor.blue
    myView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(myView)

    // Add constraints code here (choose one of the methods below)
    // ...
}

পদ্ধতি 1: অ্যাঙ্কর স্টাইল

// width and height
myView.widthAnchor.constraint(equalToConstant: 200).isActive = true
myView.heightAnchor.constraint(equalToConstant: 100).isActive = true

// center in container
myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

পদ্ধতি 2: এনএসআলআউটকন্ট্রাইন্ট স্টাইল

// width and height
NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 200).isActive = true
NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100).isActive = true

// center in container
NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0).isActive = true

মন্তব্য

  • অ্যাঙ্কর স্টাইল স্টাইলের চেয়ে পছন্দসই পদ্ধতি NSLayoutConstraint, তবে এটি কেবল আইওএস 9 থেকে পাওয়া যায়, তাই আপনি যদি আইওএস 8 সমর্থন করে থাকেন তবে আপনার এখনও NSLayoutConstraintস্টাইল ব্যবহার করা উচিত ।
  • আরও দেখুন প্রোগ্রামেটিক্যালি তৈরি করা হচ্ছে সীমাবদ্ধতাসমূহ ডকুমেন্টেশন।
  • পিনিং সীমাবদ্ধতা যুক্ত করার অনুরূপ উদাহরণের জন্য এই উত্তরটি দেখুন ।

5

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


5

আমি আমার self.myViewভিউয়ের মতো স্থানীয় ভেরিয়েবলের পরিবর্তে জাতীয় সম্পত্তি কেন ব্যবহার করতে পারি না ?

ব্যবহার করার চেষ্টা করুন:

NSDictionaryOfVariableBindings(_view)

পরিবর্তে self.view


এটি আমার অ্যাপটিকে ক্র্যাশ করেছে, এটি বার্তা দেয়: 'সীমাবদ্ধতার ফর্ম্যাটটি পার্স করতে অক্ষম: পললাইন আইমেজভিউ ভিউ অভিধানে কোনও কী নয়' '
তাই লে

4

দয়া করে নোট করুন যে আইওএস 9 থেকে আমরা নতুন সহায়ক সহায়ক এনএসএলআউটআনচারার সাবক্লাস ব্যবহার করে প্রোগ্রামটিমেটিকভাবে "আরও সংক্ষিপ্ত, এবং সহজভাবে পড়া সহজ" সংজ্ঞাগুলি সংজ্ঞায়িত করতে পারি ।

দস্তাবেজের একটি উদাহরণ:

[self.cancelButton.leadingAnchor constraintEqualToAnchor:self.saveButton.trailingAnchor constant: 8.0].active = true;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.