ios - আমি NSLayoutConstraint জন্য গুণগত মান পরিবর্তন করতে পারেন?



iphone objective-c (8)

আমি একটি তত্ত্বাবধানে দুটি দৃশ্য তৈরি করেছি, এবং তারপরে দর্শনের মধ্যে সীমাবদ্ধতা যোগ করেছি:

_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];
[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];
_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];
[self addConstraint:_indicatorConstrainWidth];
[self addConstraint:_indicatorConstrainHeight];

এখন আমি অ্যানিমেশনের সাথে গুণগত মান পরিবর্তন করতে চাই, কিন্তু গুণগত সম্পত্তি পরিবর্তন করতে পারছি না। (আমি হেডার ফাইল NSLayoutConstraint.h ব্যক্তিগত সম্পত্তি মধ্যে _coefficient খুঁজে পাওয়া যায় নি, কিন্তু এটা ব্যক্তিগত।)

আমি গুণগত সম্পত্তি কিভাবে পরিবর্তন করতে পারি?

আমার কার্যকারিতা পুরোনো সীমাবদ্ধতা সরিয়ে এবং গুণকটির জন্য একটি ভিন্ন মান সহ নতুন এক যোগ করতে হয়।

https://src-bin.com


Answer #1

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

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

আমি একটি proportionipad এবং অন্যান্য অনুপাত আইফোন নামকরণ।

তারপরে, নিচের কোডটি দেখুন, দেখুনডিল লোড

override open func viewDidLoad() {
   super.viewDidLoad()
   if ... {

       view.removeConstraint(proportionIphone)
       view.addConstraint(proportionIpad) 
   }     
}

আমি এক্সকোড 10 ব্যবহার করছি এবং দ্রুত 5.0


Answer #2

অন্যান্য উত্তর হিসাবে ব্যাখ্যা করা হয়েছে: আপনি সীমাবদ্ধতা অপসারণ এবং একটি নতুন তৈরি করতে হবে।

আপনি NSLayoutConstraint inout প্যারামিটারের জন্য স্ট্যাটিক পদ্ধতি তৈরি করে নতুন সীমাবদ্ধতা প্রত্যাহার এড়াতে পারেন, যা আপনাকে inout সীমাবদ্ধতা পুনঃনির্দেশ করতে দেয়

import UIKit

extension NSLayoutConstraint {

    static func setMultiplier(_ multiplier: CGFloat, of constraint: inout NSLayoutConstraint) {
        NSLayoutConstraint.deactivate([constraint])

        let newConstraint = NSLayoutConstraint(item: constraint.firstItem, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAttribute, multiplier: multiplier, constant: constraint.constant)

        newConstraint.priority = constraint.priority
        newConstraint.shouldBeArchived = constraint.shouldBeArchived
        newConstraint.identifier = constraint.identifier

        NSLayoutConstraint.activate([newConstraint])
        constraint = newConstraint
    }

}

উদাহরণ ব্যবহার:

@IBOutlet weak var constraint: NSLayoutConstraint!

override func viewDidLoad() {
    NSLayoutConstraint.setMultiplier(0.8, of: &constraint)
    // view.layoutIfNeeded() 
}

Answer #3

আপনি একটু গণিত সঙ্গে একই লক্ষ্য অর্জন করার পরিবর্তে "ধ্রুবক" সম্পত্তি পরিবর্তন করতে পারেন। সীমাবদ্ধতা আপনার ডিফল্ট গুণক অনুমান 1.0f হয়। এটি জ্যামারিন সি # কোড যা সহজে উদ্দেশ্য-সি-তে অনুবাদ করা যেতে পারে

private void SetMultiplier(nfloat multiplier)
{
    FirstItemWidthConstraint.Constant = -secondItem.Frame.Width * (1.0f - multiplier);
}

Answer #4

উপরের কোডের কোনটি আমার জন্য কাজ করে নি তাই আমার কোডটি সংশোধন করার চেষ্টা করার পরে এই কোডটি Xcode 10 এবং দ্রুত গতিতে 4.2

import UIKit
extension NSLayoutConstraint {
/**
 Change multiplier constraint

 - parameter multiplier: CGFloat
 - returns: NSLayoutConstraintfor 
*/i
func setMultiplier(multiplier:CGFloat) -> NSLayoutConstraint {

    NSLayoutConstraint.deactivate([self])

    let newConstraint = NSLayoutConstraint(
        item: firstItem,
        attribute: firstAttribute,
        relatedBy: relation,
        toItem: secondItem,
        attribute: secondAttribute,
        multiplier: multiplier,
        constant: constant)

    newConstraint.priority = priority
    newConstraint.shouldBeArchived = self.shouldBeArchived
    newConstraint.identifier = self.identifier

    NSLayoutConstraint.activate([newConstraint])
    return newConstraint
}
}



 @IBOutlet weak var myDemoConstraint:NSLayoutConstraint!

override func viewDidLoad() {
let newMultiplier:CGFloat = 0.80
myDemoConstraint = myDemoConstraint.setMultiplier(newMultiplier)

//If later in view lifecycle, you may need to call view.layoutIfNeeded() 
 }

Answer #5

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

struct MyConstraint {
  static func changeMultiplier(_ constraint: NSLayoutConstraint, multiplier: CGFloat) -> NSLayoutConstraint {
    let newConstraint = NSLayoutConstraint(
      item: constraint.firstItem,
      attribute: constraint.firstAttribute,
      relatedBy: constraint.relation,
      toItem: constraint.secondItem,
      attribute: constraint.secondAttribute,
      multiplier: multiplier,
      constant: constraint.constant)

    newConstraint.priority = constraint.priority

    NSLayoutConstraint.deactivate([constraint])
    NSLayoutConstraint.activate([newConstraint])

    return newConstraint
  }
}

ব্যবহার 1.2, গুণক পরিবর্তন:

constraint = MyConstraint.changeMultiplier(constraint, multiplier: 1.2)

Answer #6

এখানে # টিয়ানফু এর উত্তর # সি-তে উত্তর দেওয়া হয়েছে। অন্যান্য উত্তরগুলির জন্য সীমাবদ্ধতা অ্যাক্টিভেশন এবং নিষ্ক্রিয়তা প্রয়োজন ছিল আমার জন্য কাজ করে না।

    var isMapZoomed = false
@IBAction func didTapMapZoom(_ sender: UIButton) {
    let offset = -1.0*graphHeightConstraint.secondItem!.frame.height*(1.0 - graphHeightConstraint.multiplier)
    graphHeightConstraint.constant = (isMapZoomed) ? offset : 0.0

    isMapZoomed = !isMapZoomed
    self.view.layoutIfNeeded()
}

Answer #7

গুণক মান পরিবর্তন করার জন্য, নিচের পদক্ষেপগুলি অনুসরণ করুন: 1. প্রয়োজনীয় সীমাবদ্ধতা উদাহরণস্বরূপ কিছু কন্সট্রেন্ট তৈরি করুন। 2. কিছু Constraint.constant * = 0.8 বা কোন গুণক মান মত গুণক মান পরিবর্তন।

এটা যে, শুভ কোডিং।


Answer #8

যদি আপনার কাছে মাল্টিপ্লায়ারগুলির দুটি সেট থাকে তবে প্রয়োগ করা দরকার, iOS8 এর পরে আপনি সীমাবদ্ধতাগুলির উভয় সেট যুক্ত করতে পারেন এবং কোনও সময়ে সক্রিয় হওয়া উচিত তা স্থির করতে পারেন:

NSLayoutConstraint *standardConstraint, *zoomedConstraint;

// ...
// switch between constraints
standardConstraint.active = NO; // this line should always be the first line. because you have to deactivate one before activating the other one. or they will conflict.
zoomedConstraint.active = YES;
[self.view layoutIfNeeded]; // or using [UIView animate ...]




nslayoutconstraint