কোনও ইউআইভিউ প্রোগ্রামের ধ্রুবক উচ্চতার সীমাবদ্ধতা কীভাবে আপডেট করবেন?


104

আমার একটি আছে UIViewএবং আমি এক্সকোড ইন্টারফেস বিল্ডার ব্যবহার করে সীমাবদ্ধতাগুলি সেট করি।

এখন আমাকে UIViewপ্রোগ্রামটির উচ্চতার ধ্রুবতাকে আপডেট করতে হবে ।

এখানে একটি ফাংশন আছে যা যায় myUIView.updateConstraints()তবে এটি কীভাবে ব্যবহার করতে হয় তা আমি জানি না।


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

আপনি এই লিঙ্কটি বা এই লিঙ্কটি উল্লেখের জন্য ব্যবহার করতে পারেন ।
আম্না ফারহান

একক বা একাধিক প্রতিবন্ধকতা আপডেট করার একটি উপায় এখানে। stackoverflow.com/a/54171693/8861442
সারাথ কুমার রাজেন্দ্রন

উত্তর:


224

ইন্টারফেস বিল্ডার থেকে উচ্চতার সীমাবদ্ধতা নির্বাচন করুন এবং এটির একটি আউটলেট নিন। সুতরাং, আপনি যখন ভিউটির উচ্চতা পরিবর্তন করতে চান আপনি নীচের কোডটি ব্যবহার করতে পারেন।

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

পদ্ধতি updateConstraints()হল একটি উদাহরণ পদ্ধতি UIView। আপনি প্রোগ্রামিয়মে সীমাবদ্ধতাগুলি সেট করার সময় এটি সহায়ক। এটি দেখার জন্য সীমাবদ্ধতাগুলি আপডেট করে। বিস্তারিত জানতে এখানে ক্লিক করুন


60
আজ আমি শিখেছি যে সীমাবদ্ধতাগুলিকে একটি আউটলেটে পরিণত করা যেতে পারে এবং সেখান থেকে আমি এটির সাথে যা করতে চাই তা করতে পারি। ধন্যবাদ
ক্রিস মিক্কেলসেন

@ParthAdroja, ব্রো আপনি কি দয়া করে আমার প্রশ্নের কটাক্ষপাত করা যায়নি stackoverflow.com/questions/46034278/... ?
মে ফিউ

আমার কাছে একটি এক্সিব ফাইল নেই, এবং কীভাবে আপনার ইউভিউভিতে আপনার হাইটকন্সট্রেন্ট সেট করবেন?
নিউজজার

@newszer আপনি যে জন্য অন্যান্য বিষয়ের সাথে চেহারা প্রয়োজন stackoverflow.com/questions/31651022/...
পার্থ Adroja

আমি শুনেছি যে নিয়মিত প্রতিবন্ধকতা পরিবর্তনের পরে আমাদের লেআউটআইফিডে কল করা উচিত। কেন? এবং কখনও কখনও আমি ভিউলইলআউটসুবউভিউ এবং ভিউডিডলআউটসুভিউগুলিতে ভিতরে লেআউটআইফিডকে কল করি। ঠিক আছে?
mnemonic23

110

আপনার যদি একাধিক প্রতিবন্ধকতার সাথে মতামত থাকে তবে একাধিক আউটলেট তৈরি না করেই আরও সহজ উপায় হ'ল:

ইন্টারফেস বিল্ডারে, আপনি কোনও সনাক্তকারী সংশোধন করতে চান এমন প্রতিবন্ধকতা দিন:

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

তারপরে কোডে আপনি এর মতো একাধিক বাধা পরিবর্তন করতে পারেন:

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

আপনি একাধিক প্রতিবন্ধকতা একই শনাক্তকারীকে দিতে পারেন যাতে আপনি একসাথে বাধা একসাথে করতে এবং সমস্ত একবারে সংশোধন করতে পারেন।


এটি ভালভাবে কাজ করে তবে আমি সীমাবদ্ধতাগুলি গোষ্ঠীভুক্ত করার জন্য কেবল একটি নিয়মিত আউটলেট সংগ্রহ ব্যবহার করা সহজ করে দেখছি। উদাহরণস্বরূপ, আমি যে দৃশ্যে কাজ করছি সেখানে 47 টি সীমাবদ্ধতা রয়েছে তবে কেবল 6 টিই আমি রানটাইমে পরিবর্তন করতে চাই তাই এটি অনেক ছোট লুপ। এটির জন্য দুটি ভিন্ন জায়গার মধ্যে সিঙ্কে স্ট্রিংগুলি রাখারও প্রয়োজন হয় না।
গ্যারি জেড

4
এই টিপস জন্য আপনাকে জর্জ ধন্যবাদ। আমি খেলছি এমন কয়েকটি বর্তমান বিন্যাসের সাথে এটি আসল সহায়তা।
জিম হিলহাউস


হাই, আমি এটিকে একইভাবে ব্যবহার করছি তবে এটি যদি কখনও হয় না এবং আমি একই শনাক্তকারীকে দিয়েছি।
রব 13

আমি ভাবছিলাম সীমাবদ্ধতার নাম দেওয়া সম্ভব কিনা? দুর্দান্ত উত্তর!
শেডটিড

38

পরিবর্তন HeightConstraintএবং WidthConstraintতৈরি ছাড়া IBOutlet

দ্রষ্টব্য: স্টোরিবোর্ড বা XIB ফাইলে উচ্চতা বা প্রস্থের সীমাবদ্ধতা নির্ধারণ করুন। এই এক্সটেনশনটি ব্যবহার করে এই সীমাবদ্ধতা আনার পরে।

আপনি একটি উচ্চতা এবং প্রস্থের সীমাবদ্ধতা আনতে এই এক্সটেনশনটি ব্যবহার করতে পারেন:

extension UIView {

var heightConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .height && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

var widthConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .width && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

}

তুমি ব্যবহার করতে পার:

yourView.heightConstraint?.constant = newValue 

4
আপনি এখানে + এর first(where: ...)পরিবর্তে অবিলম্বে ব্যবহার করতে পারেন এমন একটি পদ্ধতি রয়েছেfilterfirst
ভায়াস্লাভ গের্চিকভ

13

আইবিআউটলেট হিসাবে আপনার উপাচার্যে সীমাবদ্ধতা টানুন। তারপরে আপনি এর সম্পর্কিত মান (এবং অন্যান্য বৈশিষ্ট্যগুলি; ডকুমেন্টেশন চেক করুন) পরিবর্তন করতে পারেন:

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!

func updateConstraints() {
    // You should handle UI updates on the main queue, whenever possible
    DispatchQueue.main.async {
        self.myConstraint.constant = 10
        self.myView.layoutIfNeeded()
    }
}

9

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

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

উপরের পদ্ধতিটি যদি কাজ না করে তবে তা Dispatch.main.async}} ব্লকে আপডেট করেছেন তা নিশ্চিত করুন। আপনাকে তখন লেআউটআইফিড () পদ্ধতিতে কল করতে হবে না।


4

নীচের কোডটি দেখানো মত আইবিআউটলেট তৈরির জন্য প্রথমে আমাদের ভিউকন্ট্রোলারের সাথে উচ্চতা সীমাবদ্ধতাটি সংযুক্ত করুন

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

তারপরে নীচের কোডটি কোনও ক্রিয়া লোড বা এর ভিতরে রেখে দেওয়া put

self.select_dateHeight.constant = 0 // we can change the height value

এটি যদি একটি বোতাম ক্লিকের ভিতরে থাকে

@IBAction func Feedback_button(_ sender: Any) {
 self.select_dateHeight.constant = 0

}

1

একটি বিন্যাস সীমাবদ্ধতা আপডেট করার জন্য আপনাকে কেবল ধ্রুবক সম্পত্তি আপডেট করতে হবে এবং পরে লেআউটআইফ্নিডে কল করতে হবে।

myConstraint.constant = newValue
myView.layoutIfNeeded()

1
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.

//Connect them from Interface 
@IBOutlet viewHeight: NSLayoutConstraint! 
@IBOutlet view: UIView!

private func updateViewHeight(height:Int){
   guard let aView = view, aViewHeight = viewHeight else{
      return
   }
   aViewHeight.constant = height
   aView.layoutIfNeeded()
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.