প্রোগ্রামগতভাবে CenterX / CenterY সীমাবদ্ধতা যুক্ত করুন


84

আমার কাছে একটি ইউআইটিএবলভিউ কনট্রোলার রয়েছে যা দেখানোর মতো কিছু না থাকলে কোনও বিভাগ প্রদর্শন করে না। আমি ব্যবহারকারীর কাছে এই কোডটি প্রদর্শন করার মতো কিছুই নেই তা বোঝাতে একটি লেবেল যুক্ত করেছি:

label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"
self.tableView.addSubview(label)

তবে এখন, আমি এটি আনুভূমিকভাবে এবং উল্লম্বভাবে কেন্দ্রিক হতে চাই। সাধারণত, আমি স্ক্রিনশটটিতে হাইলাইট দুটি বিকল্প (উচ্চতা এবং প্রস্থের জন্য আরও) বেছে নেব:

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

সীমাবদ্ধতাগুলি যুক্ত করতে আমি নীচের কোডটি চেষ্টা করেছি তবে অ্যাপটি ত্রুটির সাথে ক্র্যাশ হয়েছে:

label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"

let xConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterX, multiplier: 1, constant: 0)
let yConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterY, multiplier: 1, constant: 0)

label.addConstraint(xConstraint)
label.addConstraint(yConstraint)

ত্রুটি:

When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2014-12-23 08:17:36.755 [982:227877] *** Assertion failure in -[UILabel _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:], /SourceCache/UIKit/UIKit-3318.16.21/NSLayoutConstraint_UIKitAdditions.m:560

লেবেলটি সর্বদা অনুভূমিক এবং উল্লম্বভাবে কেন্দ্র করা উচিত কারণ অ্যাপ্লিকেশনটি ডিভাইসের ঘূর্ণন সমর্থন করে।

আমি কি ভুল করছি? কীভাবে আমি এই বাধাগুলি সফলভাবে যুক্ত করব?

ধন্যবাদ!


4
আমি এই ভিডিডলয়েডে তৈরি করছি।
মারিও এ গুজম্যান

4
আপনি যে লাইনটি লেবেলটি অন্য কোনও ভিউতে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করেছেন তা আমি দেখতে পাচ্ছি না। এটিতে সীমাবদ্ধতা যুক্ত করার আগে আপনি এটি করা গুরুত্বপূর্ণ।
স্কট বেরেরোয়েটস

আমি: লেবেল = ইউল্যাবেল (ফ্রেম: সিজিআরেক্টমেক (20, 20, 250, 100)) লেবেল.টেক্সট = "দেখানোর মতো কিছু নেই" স্ব.ট্যাবভিউ.অ্যাডসুবিউ (লেবেল)
মারিও এ গুজম্যান

উত্তর:


164

সুইফট 3 / সুইফট 4 এর জন্য আপডেট:

আইওএস 8-এর হিসাবে, আপনি তাদের isActiveসম্পত্তিগুলিতে সেট করে আপনার সীমাবদ্ধতাগুলি সক্রিয় করতে এবং করতে পারেন true। এটি যথাযথ দর্শনে নিজেকে বাধা দিতে সীমাবদ্ধ করে en সীমাবদ্ধতা সম্বলিত একটি অ্যারে পাস করে আপনি একবারে একাধিক সীমাবদ্ধতা সক্রিয় করতে পারেনNSLayoutConstraint.activate()

let label = UILabel(frame: CGRect.zero)
label.text = "Nothing to show"
label.textAlignment = .center
label.backgroundColor = .red  // Set background color to see if label is centered
label.translatesAutoresizingMaskIntoConstraints = false
self.tableView.addSubview(label)

let widthConstraint = NSLayoutConstraint(item: label, attribute: .width, relatedBy: .equal,
                                         toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 250)

let heightConstraint = NSLayoutConstraint(item: label, attribute: .height, relatedBy: .equal,
                                          toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 100)

let xConstraint = NSLayoutConstraint(item: label, attribute: .centerX, relatedBy: .equal, toItem: self.tableView, attribute: .centerX, multiplier: 1, constant: 0)

let yConstraint = NSLayoutConstraint(item: label, attribute: .centerY, relatedBy: .equal, toItem: self.tableView, attribute: .centerY, multiplier: 1, constant: 0)

NSLayoutConstraint.activate([widthConstraint, heightConstraint, xConstraint, yConstraint])

আরও ভাল সমাধান:

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

label.widthAnchor.constraint(equalToConstant: 250).isActive = true
label.heightAnchor.constraint(equalToConstant: 100).isActive = true
label.centerXAnchor.constraint(equalTo: self.tableView.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: self.tableView.centerYAnchor).isActive = true

বা একই ব্যবহার করে NSLayoutConstraint.activate():

NSLayoutConstraint.activate([
    label.widthAnchor.constraint(equalToConstant: 250),
    label.heightAnchor.constraint(equalToConstant: 100),
    label.centerXAnchor.constraint(equalTo: self.tableView.centerXAnchor),
    label.centerYAnchor.constraint(equalTo: self.tableView.centerYAnchor)
])

দ্রষ্টব্য: সীমাবদ্ধতা তৈরি এবং সক্রিয় করার আগে সর্বদা আপনার পর্যালোচনাগুলি ভিউ হায়ারার্কিতে যুক্ত করুন ।


আসল উত্তর:

সীমাবদ্ধতাগুলি উল্লেখ করে self.tableView। যেহেতু আপনি লেবেলটির একটি সংক্ষিপ্তসার হিসাবে যুক্ত করছেন তাই বাধাগুলি self.tableView"সাধারণ পূর্বপুরুষ" এ যুক্ত করা দরকার:

   self.tableView.addConstraint(xConstraint)
   self.tableView.addConstraint(yConstraint)

@ মুস্তফা এবং @ কেসিস্ট্রিক্স যেমন মন্তব্যগুলিতে উল্লেখ করেছেন, আপনাকে সেট label.translatesAutoresizingMaskIntoConstraintsকরতে হবে false। আপনি যখন এটি করেন, আপনাকে ফ্রেম আর ব্যবহার করা হয় না বলে বাধাগুলির সাথে লেবেলটির widthএবং তার নির্দিষ্টকরণও প্রয়োজন height। অবশেষে, আপনার পাঠ্যটি আপনার লেবেলে কেন্দ্রীভূত textAlignmentহয় .Centerযাতে আপনার এটিও সেট করা উচিত ।

    var  label = UILabel(frame: CGRectZero)
    label.text = "Nothing to show"
    label.textAlignment = .Center
    label.backgroundColor = UIColor.redColor()  // Set background color to see if label is centered
    label.translatesAutoresizingMaskIntoConstraints = false
    self.tableView.addSubview(label)

    let widthConstraint = NSLayoutConstraint(item: label, attribute: .Width, relatedBy: .Equal,
        toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 250)
    label.addConstraint(widthConstraint)

    let heightConstraint = NSLayoutConstraint(item: label, attribute: .Height, relatedBy: .Equal,
        toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 100)
    label.addConstraint(heightConstraint)

    let xConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterX, multiplier: 1, constant: 0)

    let yConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterY, multiplier: 1, constant: 0)

    self.tableView.addConstraint(xConstraint)
    self.tableView.addConstraint(yConstraint)

দুর্দান্ত। ধন্যবাদ.
অ্যাপ দেব গাই

4
নোঙ্গররা আমার জন্য কাজ করেছে - আমি আপনার প্রচেষ্টা প্রশংসা!
ফুলমেটালফিস্ট

37

পাত্রে কেন্দ্র

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

ইন্টারফেস বিল্ডারে কেন্দ্রীকরণ হিসাবে নীচের কোডটি একই কাজ করে।

override func viewDidLoad() {
    super.viewDidLoad()

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

    // Add code for one of the constraint methods below
    // ...
}

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

myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

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

NSLayoutConstraint(item: myView, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: myView, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0).isActive = true

মন্তব্য

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

10

উদ্দেশ্যগত সমতুল্য হ'ল:

    myView.translatesAutoresizingMaskIntoConstraints = NO;

    [[myView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor] setActive:YES];

    [[myView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor] setActive:YES];

আমার জন্য সেরা একটি, ধন্যবাদ
ফাদি আবুজন্ত

8

প্রোগ্রামগতভাবে আপনি নিম্নলিখিত সীমাবদ্ধতাগুলি যোগ করে এটি করতে পারেন।

NSLayoutConstraint *constraintHorizontal = [NSLayoutConstraint constraintWithItem:self  
                                                                      attribute:NSLayoutAttributeCenterX 
                                                                      relatedBy:NSLayoutRelationEqual 
                                                                         toItem:self.superview 
                                                                      attribute:attribute 
                                                                     multiplier:1.0f 
                                                                       constant:0.0f];

NSLayoutConstraint *constraintVertical = [NSLayoutConstraint constraintWithItem:self
                                                                        attribute:NSLayoutAttributeCenterY 
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:self.superview 
                                                                        attribute:attribute 
                                                                       multiplier:1.0f
                                                                         constant:0.0f];

দয়া করে সীমাবদ্ধতার সাথে
ভার্টিকাল পরিবর্তন করুন হরাইজন্টাল

6

সুইফ্ট 5-এ এটি দেখতে এমন দেখাচ্ছে:

label.translatesAutoresizingMaskIntoConstraints = false
label.centerXAnchor.constraint(equalTo: vc.view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: vc.view.centerYAnchor).isActive = true

1

যদি আপনি এই প্রশ্নটি বিশেষভাবে কোনও টেবিলভিউ সম্পর্কে হওয়া সম্পর্কে উদ্বিগ্ন হন না, এবং আপনি কেবল এখানে অন্য ভিউয়ের উপরে একটি দৃশ্যকে কেন্দ্র করতে চান তা করতে এখানে:

    let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: parentView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
    parentView.addConstraint(horizontalConstraint)

    let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: parentView, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
    parentView.addConstraint(verticalConstraint)

1

আমার জন্য একটি সমাধান ছিল একটি তৈরি করা UILabelএবং এটি UIButtonএকটি সংক্ষিপ্তসার হিসাবে যুক্ত করা। অবশেষে আমি বোতামটির মধ্যে এটি কেন্দ্র করতে একটি সীমাবদ্ধতা যুক্ত করেছি।

UILabel * myTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 75, 75)];
myTextLabel.text = @"Some Text";
myTextLabel.translatesAutoresizingMaskIntoConstraints = false;

[myButton addSubView:myTextLabel];

// Add Constraints
[[myTextLabel centerYAnchor] constraintEqualToAnchor:myButton.centerYAnchor].active = true;
[[myTextLabel centerXAnchor] constraintEqualToAnchor:myButton.centerXAnchor].active = true; 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.