কীভাবে প্রোগ্রামটিতে সুইফট ব্যবহার করে সীমাবদ্ধতা যুক্ত করা যায়


448

আমি গত সপ্তাহ থেকে কোনও পদক্ষেপ না নিয়েই এটি বের করার চেষ্টা করছি। ঠিক আছে, তাই আমি কিছু আবেদন করতে হবে সীমাবদ্ধতার প্রোগ্রামেটিক্যালি মধ্যে সুইফট একটি থেকে UIViewএই কোড ব্যবহার করছে:

var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);

var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);

var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);

var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);

var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);

তবে এক্সকোড এই অদ্ভুত আউটপুটটি রিটার্ন করে:

2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints.  Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0]   (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.

2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints.  Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0]  (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

আপনি কি আমাকে সাহায্য করতে পারেন? অনেক ধন্যবাদ


1
দয়া করে ত্রুটি বার্তাগুলি কোড ব্লক হিসাবে পেস্ট করুন, উদ্ধৃত পাঠ্য হিসাবে নয়। তার মানে আপনার প্রতিটি লাইনের শুরুতে চারটি স্পেস রাখতে হবে, একটি নয় >। আমি এবার আপনার জন্য এটি স্থির করেছি।
রব মায়ফ


1
আপনি ডায়নামিক এবং সাধারণ সীমাবদ্ধতার জন্য দুর্দান্ত এই লাইব্রেরিটি ব্যবহার করতে চাইতে পারেন। github.com/SnapKit/SapapKit
আশিষ

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

এখানে একটি পোস্ট রয়েছে যা কোডের মাধ্যমে কীভাবে বাধা যুক্ত করতে হবে তা ব্যাখ্যা করবে: slicode.com/…
শঙ্কর বিএস

উত্তর:


1057

আপনি যদি একটি ছক আছে পরিকল্পনা করবেন UIViewএর প্রস্থ: 100 এবং উচ্চতা: 100 ভিতরে কেন্দ্রিক UIViewএকটি এর UIViewController? যদি তা হয় তবে আপনি নিম্নলিখিত 6 টি অটো লেআউট শৈলীর মধ্যে একটি (সুইফ্ট 5 / আইওএস 12.2) ব্যবহার করতে পারেন:


1. NSLayoutConstraintইনিশিয়ালাইজার ব্যবহার করে

override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0)
    let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0)
    let widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 100)
    let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 100)
    view.addConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0)
    let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0)
    let widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 100)
    let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 100)
    NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 100).isActive = true
    NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 100).isActive = true
}

২. ভিজ্যুয়াল ফরম্যাট ল্যাঙ্গুয়েজ ব্যবহার করা

override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let views = ["view": view!, "newView": newView]
    let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-(<=0)-[newView(100)]", options: NSLayoutConstraint.FormatOptions.alignAllCenterY, metrics: nil, views: views)
    let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[view]-(<=0)-[newView(100)]", options: NSLayoutConstraint.FormatOptions.alignAllCenterX, metrics: nil, views: views)
    view.addConstraints(horizontalConstraints)
    view.addConstraints(verticalConstraints)
}
override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let views = ["view": view!, "newView": newView]
    let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-(<=0)-[newView(100)]", options: NSLayoutConstraint.FormatOptions.alignAllCenterY, metrics: nil, views: views)
    let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[view]-(<=0)-[newView(100)]", options: NSLayoutConstraint.FormatOptions.alignAllCenterX, metrics: nil, views: views)
    NSLayoutConstraint.activate(horizontalConstraints)
    NSLayoutConstraint.activate(verticalConstraints)
}

৩. NSLayoutConstraintইনিশিয়ালাইজার এবং ভিজ্যুয়াল ফর্ম্যাট ল্যাঙ্গুয়েজের মিশ্রণ ব্যবহার করে

override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let views = ["newView": newView]
    let widthConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[newView(100)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: views)
    let heightConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[newView(100)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: views)
    let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0)
    let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0)
    view.addConstraints(widthConstraints)
    view.addConstraints(heightConstraints)
    view.addConstraints([horizontalConstraint, verticalConstraint])
}
override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let views = ["newView": newView]
    let widthConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[newView(100)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: views)
    let heightConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[newView(100)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: views)
    let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0)
    let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0)
    NSLayoutConstraint.activate(widthConstraints)
    NSLayoutConstraint.activate(heightConstraints)
    NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
}
override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let views = ["newView": newView]
    let widthConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[newView(100)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: views)
    let heightConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[newView(100)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: views)
    NSLayoutConstraint.activate(widthConstraints)
    NSLayoutConstraint.activate(heightConstraints)
    NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: newView, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0).isActive = true
}

4. ব্যবহার UIView.AutoresizingMask

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

override func viewDidLoad() {
    let newView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = true
    newView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
    newView.autoresizingMask = [UIView.AutoresizingMask.flexibleLeftMargin, UIView.AutoresizingMask.flexibleRightMargin, UIView.AutoresizingMask.flexibleTopMargin, UIView.AutoresizingMask.flexibleBottomMargin]
}

5. ব্যবহার NSLayoutAnchor

override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
    let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    let widthConstraint = newView.widthAnchor.constraint(equalToConstant: 100)
    let heightConstraint = newView.heightAnchor.constraint(equalToConstant: 100)
    view.addConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
    let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    let widthConstraint = newView.widthAnchor.constraint(equalToConstant: 100)
    let heightConstraint = newView.heightAnchor.constraint(equalToConstant: 100)
    NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
override func viewDidLoad() {
    let newView = UIView()
    newView.backgroundColor = UIColor.red
    view.addSubview(newView)

    newView.translatesAutoresizingMaskIntoConstraints = false
    newView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    newView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    newView.widthAnchor.constraint(equalToConstant: 100).isActive = true
    newView.heightAnchor.constraint(equalToConstant: 100).isActive = true
}

6. ব্যবহার intrinsicContentSizeএবংNSLayoutAnchor

import UIKit

class CustomView: UIView {

    override var intrinsicContentSize: CGSize {
        return CGSize(width: 100, height: 100)
    }

}

class ViewController: UIViewController {

    override func viewDidLoad() {
        let newView = CustomView()
        newView.backgroundColor = UIColor.red
        view.addSubview(newView)

        newView.translatesAutoresizingMaskIntoConstraints = false
        let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
    }

}

ফলাফল:

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


3
অ্যাঙ্কর শৈলীর সীমাবদ্ধতা অ্যানিমেট করার কোনও উপায় আছে কি?
Liumx31

5
আমি বিকল্প 5 / অ্যাঙ্কর স্টাইল সম্পর্কে জানতাম না, আমি সত্যিই এটি পছন্দ করি কারণ আমি যা করতে চাইছি তার মডেলের সাথে এটি সবচেয়ে ভাল ফিট করে। তবে আমি বাধাগুলি যুক্ত করার পরে সেগুলি আপডেট করার প্রবণতা রাখি না কারণ আমি একটি শর্টহ্যান্ড ব্যবহার করি যা সেগুলি তৈরি করার সাথে সাথে তাদের সক্রিয় করে newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
তোলে

যদি আপনি অফসেটগুলি চান, উদাহরণস্বরূপ এটি ব্যবহার করুন h = newView.centerXAunchor.constraintEqualToAunchor (ভিউ.সেন্টারএক্সএনচারার, ধ্রুবক: 80) বা ডাব্লু = আপডেটআলভলডপোভার.সেন্টিআ্যানচারার। কন্ট্রেন্টএক্টাল টোঅ্যাঙ্কর (ভিউ.টপঅন্টার, ধ্রুবক: 100)
কুকি

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

1
newView.translatesAutoresizingMaskIntoConstraints = falseঅংশটি ভুলে যাবেন না ! আমাকে দেখতে কিছুটা সময় লেগেছিল
হুওয়ার

247

এটি আমাকে দৃষ্টিভঙ্গি শিখতে সহায়তা করে, সুতরাং এটি পরিপূরক উত্তর।

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

override func viewDidLoad() {
    super.viewDidLoad()

    let myView = UIView()
    myView.backgroundColor = UIColor.blue
    myView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(myView)

    // Add constraints code here
    // ...
}

নীচের প্রতিটি উদাহরণ অন্যের থেকে স্বতন্ত্র।

বাম প্রান্ত পিন করুন

myView.leading = leadingMargin + 20

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

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

let margins = view.layoutMarginsGuide
myView.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 20).isActive = true
  • এ ছাড়াও leadingAnchor , সেখানে হয় trailingAnchor, topAnchorএবং bottomAnchor

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

NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.leadingMargin, multiplier: 1.0, constant: 20.0).isActive = true
  • এ ছাড়াও .leading রয়েছে .trailing, .topএবং .bottom
  • এ ছাড়াও .leadingMargin রয়েছে .trailingMargin, .topMarginএবং .bottomMargin

প্রস্থ এবং উচ্চতা নির্ধারণ করুন

width = 200
height = 100

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

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

myView.widthAnchor.constraint(equalToConstant: 200).isActive = true
myView.heightAnchor.constraint(equalToConstant: 100).isActive = true

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

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

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

myView.centerX = centerX
myView.centerY = centerY

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

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

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

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

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স্টাইল ব্যবহার করা উচিত ।
  • উপরের উদাহরণগুলিতে কেবলমাত্র এক বা দুটি সীমাবদ্ধতা দেখানো হয়েছিল যার দিকে মনোনিবেশ করা হচ্ছে। তবে সঠিকভাবে রাখার জন্যmyView আমার পরীক্ষার প্রকল্পে জন্য আমার চারটি বাধা থাকা দরকার have

আরও পড়া


2
খুব সুন্দর! একটি ছোট নোট: leadingবনাম centerXসীমাবদ্ধতার মধ্যে কেবল একটি নির্দিষ্ট করা উচিত।
সাইবারডুড

1
@ সাইবারডুড, হ্যাঁ, আপনি ঠিক বলেছেন। আমি উপরের সমস্ত উদাহরণকে একে অপরের থেকে স্বতন্ত্র হওয়া, সমস্ত দৃষ্টিভঙ্গি একই দৃষ্টিতে যোগ না করে বোঝাতে চেয়েছিলাম। যদিও আমি পছন্দ করতাম ততটা পরিষ্কার নয়।
সুরগাচ

আপনার প্রয়োজনীয় বাদ addConstraint()উপর viewঅর্ডার layoutconstraints রেজিস্টার করতে হবে।
মার্টিন

@ সুরগছ অসাধারণ;)
আমির খান

34

আপনি যদি নিজের সুপার ভিউটি পূরণ করতে চান তবে আমি দ্রুততম উপায়টির পরামর্শ দিচ্ছি:

    view.translatesAutoresizingMaskIntoConstraints = false
    let attributes: [NSLayoutAttribute] = [.top, .bottom, .right, .left]
    NSLayoutConstraint.activate(attributes.map {
        NSLayoutConstraint(item: view, attribute: $0, relatedBy: .equal, toItem: view.superview, attribute: $0, multiplier: 1, constant: 0)
    })

আইওএস as-এর মতো আপনার যদি সমান সীমাবদ্ধতার প্রয়োজন হয় তবে এনএসএলআউটআন্টার চেক আউট করার প্রয়োজন হয় না তবে এটি সরাসরি NSLayoutConstraint ব্যবহার করে পড়তে অনেক সহজ হয়:

    view.translatesAutoresizingMaskIntoConstraints = false
    view.topAnchor.constraint(equalTo: view.superview!.topAnchor).isActive = true
    view.bottomAnchor.constraint(equalTo: view.superview!.bottomAnchor).isActive = true
    view.leadingAnchor.constraint(equalTo: view.superview!.leadingAnchor, constant: 10).isActive = true
    view.trailingAnchor.constraint(equalTo: view.superview!.trailingAnchor, constant: 10).isActive = true

3
ডাব্লুডাব্লুডিসি ভিডিওর এই মুহুর্তের উপর ভিত্তি করে । একের পর এক সীমাবদ্ধতা সক্রিয় করার পক্ষে এটি দক্ষ isActive = trueনয় কারণ করা সর্বদা ভাল ধারণা নয়। সম্পর্কিত সীমাবদ্ধতাগুলিকে একটিতে গোষ্ঠী করা এবং একবারে ব্যবহার করে সেগুলি সক্রিয় করা আরও ভাল এবং আরও পারফরম্যান্স NSLayoutConstraint.activate
মধু

21

খেলার মাঠে একাধিক দেখার জন্য সীমাবদ্ধতা।

দ্রুত 3+

  var yellowView: UIView!
    var redView: UIView!

    override func loadView() {

        // UI

        let view = UIView()
        view.backgroundColor = .white

        yellowView = UIView()
        yellowView.backgroundColor = .yellow
        view.addSubview(yellowView)

        redView = UIView()
        redView.backgroundColor = .red
        view.addSubview(redView)

        // Layout
        redView.translatesAutoresizingMaskIntoConstraints = false
        yellowView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            yellowView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
            yellowView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
            yellowView.widthAnchor.constraint(equalToConstant: 80),
            yellowView.heightAnchor.constraint(equalToConstant: 80),

            redView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20),
            redView.trailingAnchor.constraint(equalTo: view.trailingAnchor,constant: -20),
            redView.widthAnchor.constraint(equalToConstant: 80),
            redView.heightAnchor.constraint(equalToConstant: 80)
            ])

        self.view = view
    }

আমার মতে, xcode খেলার মাঠ প্রোগ্রামগতভাবে সীমাবদ্ধতা শেখার জন্য সেরা জায়গা।

খেলার মাঠের চিত্র


12

সমস্যাটি, যেমন ত্রুটি বার্তাটি বলেছে, তা হ'ল NSAutoresizingMaskLayoutConstraintsআপনার স্পষ্ট সীমাবদ্ধতার সাথে দ্বন্দ্বের টাইপের সীমাবদ্ধতা রয়েছে কারণ new_view.translatesAutoresizingMaskIntoConstraintsএটি সত্য হিসাবে সেট করা আছে।

আপনি কোডে তৈরি দর্শনগুলির জন্য এটি ডিফল্ট সেটিংস। আপনি এটি এইভাবে বন্ধ করতে পারেন:

var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100))
new_view.translatesAutoresizingMaskIntoConstraints = false

এছাড়াও, আপনার প্রস্থ এবং উচ্চতার সীমাবদ্ধতা অদ্ভুত। আপনি যদি দেখতে চান যে দৃশ্যের স্থির প্রস্থ থাকে, তবে এটি সঠিক উপায়:

new_view.addConstraint(NSLayoutConstraint(
    item:new_view, attribute:NSLayoutAttribute.Width,
    relatedBy:NSLayoutRelation.Equal,
    toItem:nil, attribute:NSLayoutAttribute.NotAnAttribute,
    multiplier:0, constant:100))

(আপনি যে প্রস্থটি চান সেটি 100 প্রতিস্থাপন করুন))

আপনার স্থাপনার লক্ষ্য যদি আইওএস 9.0 বা তার পরে হয় তবে আপনি এই সংক্ষিপ্ত কোডটি ব্যবহার করতে পারেন:

new_view.widthAnchor.constraintEqualToConstant(100).active = true

যাইহোক, এই জাতীয় লেআউটের জন্য (স্থির আকার এবং প্যারেন্ট ভিউতে কেন্দ্রীভূত) অটোরেসাইজিং মাস্কটি ব্যবহার করা সহজ হবে এবং সিস্টেমটি মাস্কটিকে সীমাবদ্ধতায় অনুবাদ করতে দেবে:

var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100))
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);

// This is the default setting but be explicit anyway...
new_view.translatesAutoresizingMaskIntoConstraints = true

new_view.autoresizingMask = [ .FlexibleTopMargin, .FlexibleBottomMargin,
    .FlexibleLeftMargin, .FlexibleRightMargin ]

new_view.center = CGPointMake(view.bounds.midX, view.bounds.midY)

মনে রাখবেন যে আপনি অটোলেআউট ব্যবহার করার পরেও অটোরেজাইজিং ব্যবহার সম্পূর্ণ বৈধ। (ইউআইকিট এখনও অভ্যন্তরীণভাবে প্রচুর স্থানে অটোরেসাইজিং ব্যবহার করে)) সমস্যাটি হ'ল অটোরেসাইজিং ব্যবহার করা এমন দৃশ্যে অতিরিক্ত বাধা প্রয়োগ করা কঠিন।


যদি ইউআইকিট অভ্যন্তরীণভাবে অটোরেসাইজিং ব্যবহার করে তবে এটি কেন্দ্রে নোঙ্গর করা বাধাগুলির দুর্ব্যবহারের ব্যাখ্যা দিতে পারে? আমি যখন ইউআইবিউটের একটি সংকলনকে ইউআইভিউয়ের উপক্লাস হিসাবে সংগঠিত করি তখন অ্যাঙ্কর সীমাবদ্ধতাগুলি কাজ করতে উপস্থিত হয় তবে আমি যখন ভিউকন্ট্রোলারের মধ্যে ফাংশন হিসাবে তাদের সংগঠিত করি তখন তারা কাজ করে না। আপনি যদি সময়টি অবকাশ রাখতে পারেন তবে আপনার এই পোস্টটি একবার দেখে নিতে পারেন [ স্ট্যাকওভারফ্লো / প্রশ্ন / 40650951/… le লির-আমরা-ক্যান্ট-আসলে-কোনও-নতুন-বেড়ের কারণে]
গ্রেগ

না, এটি আপনার কোডটির দুর্ব্যবহারের ব্যাখ্যা দেয় না।
রব মায়ফ

12

মূলত এটি 3 পদক্ষেপ জড়িত

fileprivate func setupName() { 

    lblName.text = "Hello world"

    // Step 1
    lblName.translatesAutoresizingMaskIntoConstraints = false

    //Step 2
    self.view.addSubview(lblName)

    //Step 3
    NSLayoutConstraint.activate([
        lblName.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
        lblName.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
    ])
}

এটি পর্দার মাঝে "হ্যালো ওয়ার্ল্ড" লেবেল রাখে।

লিংক অটোলেআউট সীমাবদ্ধতা প্রোগ্রামক্রমে উল্লেখ করুন


9

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

import UIKit

class ViewController: UIViewController {

let redView: UIView = {

    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .red
    return view
}()

override func viewDidLoad() {
    super.viewDidLoad()

    setupViews()
    setupAutoLayout()
}

func setupViews() {

    view.backgroundColor = .white
    view.addSubview(redView)
}

func setupAutoLayout() {

    // Available from iOS 9 commonly known as Anchoring System for AutoLayout...
    redView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
    redView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true

    redView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    redView.heightAnchor.constraint(equalToConstant: 300).isActive = true

    // You can also modified above last two lines as follows by commenting above & uncommenting below lines...
    // redView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
    // redView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
 }
}

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

সীমাবদ্ধতার ধরণ

 /*
// regular use
1.leftAnchor
2.rightAnchor
3.topAnchor
// intermediate use
4.widthAnchor
5.heightAnchor
6.bottomAnchor
7.centerXAnchor
8.centerYAnchor
// rare use
9.leadingAnchor
10.trailingAnchor
etc. (note: very project to project)
*/

= মিথ্যা যোগ করতে youViewName.translatesAutoresizingMaskIntoConstraints ভুলবেন না
iAj

6

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

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let myImageView:UIImageView = UIImageView()
myImageView.backgroundColor = UIColor.red
myImageView.image = UIImage(named:"sample_dog")!
myImageView.translatesAutoresizingMaskIntoConstraints = false
myImageView.layer.borderColor = UIColor.red.cgColor
myImageView.layer.borderWidth = 10
self.view.addSubview(myImageView)

view.removeConstraints(view.constraints)


view.addConstraint(NSLayoutConstraint(
item: myImageView,
attribute: .top,
relatedBy: .equal,
toItem: view,
attribute: .top,
multiplier: 1,
constant:100)

)

view.addConstraint(NSLayoutConstraint(
item: myImageView,
attribute: .centerX,
relatedBy: .equal,
toItem: view,
attribute: .centerX,
multiplier: 1,
constant:0)
)

view.addConstraint(NSLayoutConstraint(
item: myImageView,
attribute: .height,
relatedBy: .equal,
toItem: view,
attribute: .width,
multiplier: 0.5,
constant:40))

view.addConstraint(NSLayoutConstraint(
item: myImageView,
attribute: .width,
relatedBy: .equal,
toItem: view,
attribute: .width,
multiplier: 0.5,
constant:40))

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

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


4

এটি এক্সকোড 7.3.1 এ কিছুটা আলাদা। এটিই আমি নিয়ে এসেছি

   // creating the view
        let newView = UIView()
        newView.backgroundColor = UIColor.redColor()
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)

        // creating the constraint 

        // attribute and relation cannot be set directyl you need to create a cariable of them
        let layout11 = NSLayoutAttribute.CenterX
        let layout21 = NSLayoutRelation.Equal
        let layout31 = NSLayoutAttribute.CenterY
        let layout41 = NSLayoutAttribute.Width
        let layout51 = NSLayoutAttribute.Height
        let layout61 = NSLayoutAttribute.NotAnAttribute

        // defining all the constraint
        let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: layout11, relatedBy: layout21, toItem: view, attribute: layout11, multiplier: 1, constant: 0)
        let verticalConstraint = NSLayoutConstraint(item: newView, attribute: layout31, relatedBy: layout21, toItem: view, attribute: layout31, multiplier: 1, constant: 0)
        let widthConstraint = NSLayoutConstraint(item: newView, attribute: layout41, relatedBy: layout21, toItem: nil, attribute: layout61, multiplier: 1, constant: 100)
        let heightConstraint = NSLayoutConstraint(item: newView, attribute: layout51, relatedBy: layout21, toItem: nil, attribute: layout61, multiplier: 1, constant: 100)

        // adding all the constraint
        NSLayoutConstraint.activateConstraints([horizontalConstraint,verticalConstraint,widthConstraint,heightConstraint])


4

ইমানো পেটিটের উত্তরে কিছু তাত্ত্বিক ধারণা যুক্ত করতে চাই, যাতে অটো লেআউট কীভাবে কাজ করে তা বুঝতে পারে।

স্বয়ংক্রিয় বিন্যাস বুঝতে আপনার দৃষ্টিভঙ্গিটিকে রাবারের বস্তু হিসাবে বিবেচনা করুন যা প্রাথমিকভাবে সঙ্কুচিত।

স্ক্রিনে কোনও বস্তু স্থাপনের জন্য আমাদের 4 টি বাধ্যতামূলক জিনিস প্রয়োজন:

  • এক্স অবজেক্টের স্থানাঙ্ক (অনুভূমিক অবস্থান)।

  • অবজেক্টের ওয়াই সমন্বয় (উল্লম্ব অবস্থান)

  • অবজেক্টের প্রস্থ

  • অবজেক্টের উচ্চতা।

1 এক্স সমন্বয়: একটি দর্শনকে এক্স স্থানাঙ্ক দেওয়ার একাধিক উপায় রয়েছে।

যেমন নেতৃস্থানীয় সীমাবদ্ধতা, চলার সীমাবদ্ধতা, অনুভূমিকভাবে কেন্দ্র ইত্যাদি

2 Y স্থানাঙ্ক: একটি দৃশ্যে y স্থানাঙ্ক দেওয়ার একাধিক উপায় রয়েছে:

যেমন শীর্ষ সীমাবদ্ধতা, নীচের সীমাবদ্ধতা, উল্লম্ব কেন্দ্র ইত্যাদি

3 অবজেক্টের প্রস্থ: দেখার পক্ষে প্রস্থের সীমাবদ্ধতার দুটি উপায় রয়েছে:

ক। স্থির প্রস্থের সীমাবদ্ধতা যুক্ত করুন (এই সীমাবদ্ধতাটিকে স্থির প্রস্থের লোহার রড হিসাবে বিবেচনা করুন এবং আপনি আপনার রাবারের বস্তুটিকে এটির সাথে অনুভূমিকভাবে আঁকিয়েছেন যাতে রাবারের বস্তু সঙ্কুচিত বা প্রসারিত না হয়)

খ। কোনও প্রস্থের সীমাবদ্ধতা যুক্ত করবেন না তবে উভয় প্রসারিত এবং অগ্রণী উভয় প্রান্তে x স্থানাঙ্কিত সীমাবদ্ধতা যুক্ত করুন, এই দুটি সীমাবদ্ধতা আপনার রাবারের অবজেক্টটিকে এটিকে উভয় প্রান্ত থেকে টেনে / ধাক্কা দিয়ে প্রসারিত / সঙ্কুচিত করবে, শীর্ষস্থানীয় এবং পিছনে করবে।

4 অবজেক্টের উচ্চতা: প্রস্থের মতো, একটি দৃশ্যেও উচ্চতার সীমাবদ্ধতা দেওয়ার দুটি উপায় রয়েছে:

ক। স্থির উচ্চতার সীমাবদ্ধতা যুক্ত করুন (এই সীমাবদ্ধতাগুলিকে স্থির উচ্চতার লোহার রড হিসাবে বিবেচনা করুন এবং আপনি আপনার রাবারের বস্তুকে উল্লম্বভাবে এঁকে দিয়েছেন যাতে রাবারের বস্তু সঙ্কুচিত বা প্রসারিত না হয়)

খ। কোনও উচ্চতার সীমাবদ্ধতা যুক্ত করবেন না তবে উপরে এবং নীচের উভয় প্রান্তে x স্থানাঙ্কিত সীমাবদ্ধতা যুক্ত করুন, এই দুটি সীমাবদ্ধতাগুলি আপনার রাবারের অবজেক্টটিকে এটিকে প্রান্ত, উপরের এবং নীচে উভয়দিকে টেনে / ধাক্কা দিয়ে প্রসারিত / সঙ্কুচিত করবে।


3
    var xCenterConstraint : NSLayoutConstraint!
    var yCenterConstraint: NSLayoutConstraint!

 xCenterConstraint = NSLayoutConstraint(item: self.view, attribute: .CenterX, relatedBy: .Equal, toItem: (Your view NAme), attribute: .CenterX, multiplier: 1, constant: 0)
            self.view.addConstraint(xCenterConstraint)

 yCenterConstraint = NSLayoutConstraint(item: self.view, attribute: .CenterY, relatedBy: .Equal, toItem: (Your view Name), attribute: .CenterY, multiplier: 1, constant: 0)
            self.view.addConstraint(yCenterConstraint)

7
দয়া করে কোডটি ব্যাখ্যা করুন এবং এটি কীভাবে প্রশ্নের উত্তর দেয়।
বেন রাইস-লুইস 8

3

এটি প্রোগ্রামিকভাবে বাধা যুক্ত করার এক উপায়

override func viewDidLoad() {
            super.viewDidLoad()


let myLabel = UILabel()
        myLabel.labelFrameUpdate(label: myLabel, text: "Welcome User", font: UIFont(name: "times new roman", size: 40)!, textColor: UIColor.red, textAlignment: .center, numberOfLines: 0, borderWidth: 2.0, BorderColor: UIColor.red.cgColor)
        self.view.addSubview(myLabel)


         let myLabelhorizontalConstraint = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0)
        let myLabelverticalConstraint = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0)
        let mylabelLeading = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 10)
        let mylabelTrailing = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: -10)
        let myLabelheightConstraint = NSLayoutConstraint(item: myLabel, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 50)
        NSLayoutConstraint.activate(\[myLabelhorizontalConstraint, myLabelverticalConstraint, myLabelheightConstraint,mylabelLeading,mylabelTrailing\])
}

extension UILabel
{
    func labelFrameUpdate(label:UILabel,text:String = "This is sample Label",font:UIFont = UIFont(name: "times new roman", size: 20)!,textColor:UIColor = UIColor.red,textAlignment:NSTextAlignment = .center,numberOfLines:Int = 0,borderWidth:CGFloat = 2.0,BorderColor:CGColor = UIColor.red.cgColor){
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = text
        label.font = font
        label.textColor = textColor
        label.textAlignment = textAlignment
        label.numberOfLines = numberOfLines
        label.layer.borderWidth = borderWidth
        label.layer.borderColor = UIColor.red.cgColor
    }
}

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


2

আপনি সমস্ত সংজ্ঞায়িত বাধা যুক্ত করছেন self.viewযা ভুল, কারণ প্রস্থ এবং উচ্চতার সীমাবদ্ধতা আপনার যুক্ত করা উচিতnewView

এছাড়াও, আমি যেমন বুঝতে পারি আপনি ধ্রুবক প্রস্থ এবং উচ্চতা 100: 100 সেট করতে চান। এই ক্ষেত্রে আপনার কোডটি এতে পরিবর্তন করা উচিত:

var constW = NSLayoutConstraint(item: newView, 
    attribute: .Width, 
    relatedBy: .Equal, 
    toItem: nil, 
    attribute: .NotAnAttribute, 
    multiplier: 1, 
    constant: 100)
newView.addConstraint(constW)

var constH = NSLayoutConstraint(item: newView, 
    attribute: .Height, 
    relatedBy: .Equal, 
    toItem: nil, 
    attribute: .NotAnAttribute, 
    multiplier: 1, 
    constant: 100)
newView.addConstraint(constH)

2

উপরেরটি কুৎসিত বলে মনে হলে। সীমাবদ্ধতার জন্য আপনার ডিএসএল ব্যবহার করা উচিত। যেমন স্ন্যাপকিট সীমাবদ্ধতা এপিআইকে অনেক বেশি ব্যবহারকারী-বান্ধব করে তোলে

view.snp.makeConstraints { make in
    make.edges.equalToSuperview()
}

1

আমরা খুব দ্রুত সুইচ 5.1 দিয়ে এটি করতে পারি

সেটআপ 1

  • সাবভিউ সেন্টার দেখার জন্য সারিবদ্ধ
  • ফ্লোট ব্যবহার করে সাবভিউ প্রস্থের উচ্চতা সেট করুন

    view.addSubview(myView1)
    myView1.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        myView1.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        myView1.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        myView1.widthAnchor.constraint(equalToConstant: 100),
        myView1.heightAnchor.constraint(equalToConstant: 100),
    ])

সেটআপ 2

  • শীর্ষস্থানীয় এবং শীর্ষ অ্যাঙ্কর দেখতে সাবভিউ সারিবদ্ধ করুন
  • সাবউভিউ প্রস্থের প্রস্থের উচ্চতা ব্যবহার করে সেট করুন

        view.addSubview(myView2)
        myView2.translatesAutoresizingMaskIntoConstraints = false
    
        NSLayoutConstraint.activate([
            myView2.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant: 16),
            myView2.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor,constant: 16),
            myView2.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.3),
            myView2.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.3)
        ])

ফলাফল


0

UIViewসীমাবদ্ধতার জন্য এই মার্জিত এক্সটেনশানটি ব্যবহার করে দেখুন। আপনি যেমন বাধাগুলি সহজেই করতে পারেন:


 - firstView.coverWholeSuperview()
 - firstView.constraints(size: CGSize(width: 44, height: 44), centerX: view.centerXAnchor, centerY: view.centerXAnchor)
 - firstView.constraints(top: view.topAnchor, 
                         leading: secondView.leadingAnchor, 
                         bottom: view.bottomAnchor, 
                         trailing: secondView.trailingAnchor, 
                         padding: UIEdgeInsets(top: 12, left: 12, bottom: 12, right: 12))

এখানে এক্সটেনশন রয়েছে, কেবল এটি আপনার প্রকল্পে অনুলিপি করুন।

extension UIView {
    /// Attaches all sides of the receiver to its parent view
    func coverWholeSuperview(margin: CGFloat = 0.0) {
        let view = superview
        layoutAttachTop(to: view, margin: margin)
        layoutAttachBottom(to: view, margin: margin)
        layoutAttachLeading(to: view, margin: margin)
        layoutAttachTrailing(to: view, margin: margin)

    }

    /// Attaches the top of the current view to the given view's top if it's a superview of the current view
    /// or to it's bottom if it's not (assuming this is then a sibling view).
    @discardableResult
    func layoutAttachTop(to: UIView? = nil, margin: CGFloat = 0.0) -> NSLayoutConstraint {

        let view: UIView? = to ?? superview
        let isSuperview = view == superview
        let constraint = NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal,
                                            toItem: view, attribute: isSuperview ? .top : .bottom, multiplier: 1.0,
                                            constant: margin)
        superview?.addConstraint(constraint)

        return constraint
    }

    /// Attaches the bottom of the current view to the given view
    @discardableResult
    func layoutAttachBottom(to: UIView? = nil, margin: CGFloat = 0.0, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {

        let view: UIView? = to ?? superview
        let isSuperview = (view == superview) || false
        let constraint = NSLayoutConstraint(item: self, attribute: .bottom, relatedBy: .equal,
                                            toItem: view, attribute: isSuperview ? .bottom : .top, multiplier: 1.0,
                                            constant: -margin)
        if let priority = priority {
            constraint.priority = priority
        }
        superview?.addConstraint(constraint)

        return constraint
    }

    /// Attaches the leading edge of the current view to the given view
    @discardableResult
    func layoutAttachLeading(to: UIView? = nil, margin: CGFloat = 0.0) -> NSLayoutConstraint {

        let view: UIView? = to ?? superview
        let isSuperview = (view == superview) || false
        let constraint = NSLayoutConstraint(item: self, attribute: .leading, relatedBy: .equal,
                                            toItem: view, attribute: isSuperview ? .leading : .trailing, multiplier: 1.0,
                                            constant: margin)
        superview?.addConstraint(constraint)

        return constraint
    }

    /// Attaches the trailing edge of the current view to the given view
    @discardableResult
    func layoutAttachTrailing(to: UIView? = nil, margin: CGFloat = 0.0, priority: UILayoutPriority? = nil) -> NSLayoutConstraint {

        let view: UIView? = to ?? superview
        let isSuperview = (view == superview) || false
        let constraint = NSLayoutConstraint(item: self, attribute: .trailing, relatedBy: .equal,
                                            toItem: view, attribute: isSuperview ? .trailing : .leading, multiplier: 1.0,
                                            constant: -margin)
        if let priority = priority {
            constraint.priority = priority
        }
        superview?.addConstraint(constraint)

        return constraint
    }

    // For anchoring View
    struct AnchoredConstraints {
        var top, leading, bottom, trailing, width, height, centerX, centerY: NSLayoutConstraint?
    }

    @discardableResult
    func constraints(top: NSLayoutYAxisAnchor? = nil, leading: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil,
                trailing: NSLayoutXAxisAnchor? = nil, padding: UIEdgeInsets = .zero, size: CGSize = .zero,
                centerX: NSLayoutXAxisAnchor? = nil, centerY: NSLayoutYAxisAnchor? = nil,
                centerXOffset: CGFloat = 0, centerYOffset: CGFloat = 0) -> AnchoredConstraints {

        translatesAutoresizingMaskIntoConstraints = false
        var anchoredConstraints = AnchoredConstraints()

        if let top = top {
            anchoredConstraints.top = topAnchor.constraint(equalTo: top, constant: padding.top)
        }

        if let leading = leading {
            anchoredConstraints.leading = leadingAnchor.constraint(equalTo: leading, constant: padding.left)
        }

        if let bottom = bottom {
            anchoredConstraints.bottom = bottomAnchor.constraint(equalTo: bottom, constant: -padding.bottom)
        }

        if let trailing = trailing {
            anchoredConstraints.trailing = trailingAnchor.constraint(equalTo: trailing, constant: -padding.right)
        }

        if size.width != 0 {
            anchoredConstraints.width = widthAnchor.constraint(equalToConstant: size.width)
        }

        if size.height != 0 {
            anchoredConstraints.height = heightAnchor.constraint(equalToConstant: size.height)
        }

        if let centerX = centerX {
            anchoredConstraints.centerX = centerXAnchor.constraint(equalTo: centerX, constant: centerXOffset)
        }

        if let centerY = centerY {
            anchoredConstraints.centerY = centerYAnchor.constraint(equalTo: centerY, constant: centerYOffset)
        }

        [anchoredConstraints.top, anchoredConstraints.leading, anchoredConstraints.bottom,
         anchoredConstraints.trailing, anchoredConstraints.width,
         anchoredConstraints.height, anchoredConstraints.centerX,
         anchoredConstraints.centerY].forEach { $0?.isActive = true }

        return anchoredConstraints
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.