আইওএস: একজন নতুন অটোলেআউট সীমাবদ্ধতার (উচ্চতা) কীভাবে অ্যানিমেট করে


123

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

প্রথম চ্যালেঞ্জ:

আমার একটি এমকেম্যাপভিউয়ের আকার পরিবর্তন করতে হবে এবং আমি এটি নতুন অবস্থানে সঞ্চারিত করতে চাই। আমি যদি এভাবে ব্যবহার করি তবে আমি অভ্যস্ত:

[UIView animateWithDuration:1.2f
     animations:^{
         CGRect theFrame = worldView.frame;
         CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
         worldView.frame = newFrame;
}];

... তারপরে এমকেম্যাপভিউ যখনই কোনও ভাইবোন দৃষ্টিভঙ্গি আপডেট হয়ে যায় তখনই এটি তার মূল উচ্চতায় ফিরে যাবে '(আমার ক্ষেত্রে একটি ইউআইএসিগমেন্টেড কন্ট্রোলের শিরোনাম আপডেট করা হচ্ছে [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0])।

তো, আমি মনে করি আমি কি করতে UISegmentedControl এটি উপরের আপেক্ষিক হচ্ছে পিতা বা মাতা দৃশ্য এর আখ্যাত সমান হওয়া থেকে MKMapView সীমাবদ্ধতার পরিবর্তন করতে চাই ছিল আচ্ছাদন:V:[MKMapView]-(16)-[UISegmentedControl]

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

কিভাবে এই সম্পর্কে যায়?

সম্পাদনা করুন - এই অ্যানিমেশনটি অ্যানিম্যাট করছে না যদিও ভিউটির নীচে তাত্ক্ষণিকভাবে 170 টি উপরে চলেছে:

    [UIView animateWithDuration:1.2f
         animations:^{
             self.nibMapViewConstraint.constant = -170;

    }];

এবং এটি nibMapViewConstraintআইবিতে নীচে উল্লম্ব স্পেস সীমাবদ্ধ হয়ে গেছে।


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

হুম। ভেবেছিলাম আমি পারব কিন্তু আমি এনিমেট করছি না। এটি সফলভাবে পরিবর্তিত হয়, এবং এটি অ্যানিমেশন ব্লকে রয়েছে তবে অ্যানিমেটিং হয় না !!
মেলতেমি

পাওয়া আমার উত্তর এখানে: < stackoverflow.com/questions/12926566/... >
Meltemi

1
[দেখুন বিন্যাসটি আইডনিডেড] ভুলে যাবেন না, এটাই ছিল আমার সমস্যা ha আমার সমস্যা সমাধান করা একই প্রশ্ন।
ইউফ

উত্তর:


179

আপনার সীমাবদ্ধতা আপডেট করার পরে:

[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];

ধারণকৃত self.viewদৃশ্যের একটি রেফারেন্স দিয়ে প্রতিস্থাপন করুন ।


4
যে দৃশ্যটি নিজেই কাজ করে, তবে যে ভিউগুলিতে সেই দৃশ্যের সীমাবদ্ধতা রয়েছে কেবল তাত্ক্ষণিকভাবে সরে যায়। আমি কি করব? ty
ডায়েটব্যাকন

7
এই মতামতগুলির জন্যও যদি আপনার প্রয়োজন হয় তবে আপনাকে লেআউট কল করতে হবে। তবে এটি সত্যিই সঠিকভাবে কাজ করে না কারণ এটি দৃশ্যটি রিফ্রেশকেও প্রাণবন্ত করে তুলবে। কীভাবে আপনি কেবলমাত্র অন্যান্য দর্শনগুলিতে সীমাবদ্ধতা সামঞ্জস্যতা অ্যানিমেট করবেন?
এনজিবি

3
সাবধান:UIViewAnimationOptionBeginFromCurrentState লেআউট সীমাবদ্ধতা ব্যবহার করা থাকলে অ্যানিমেশনের আগে সেট করা হবে !
রবার্ট

12
layoutIfNeededএই মতামতের প্রত্যেকটির জন্য কল করার পরিবর্তে কেবল কল করুন[[self.view superview] layoutIfNeeded];
21_55

2
@ngb আপনার অ্যানিমেশন ব্লকের অভ্যন্তরে সীমাবদ্ধতা পরিবর্তন করতে হবে । এইভাবে অ্যানিমেশন দিয়ে প্রতিবন্ধকতা পরিবর্তন হয় এবং আপনি ব্যবহার চালিয়ে যেতে পারেন UIViewAnimationOptionBeginFromCurrentState
ইরান গোল্ডিন

86

এটি আমার জন্য (iOS7 এবং iOS8 + উভয়ই) কাজ করে। আপনি সামঞ্জস্য করতে চান স্বয়ংক্রিয় বিন্যাসের সীমাবদ্ধতার উপর ক্লিক করুন (ইন্টারফেস বিল্ডারে যেমন শীর্ষ সীমাবদ্ধতা)। পরবর্তী এটি একটি আইবিআউটলেট করুন;

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;

উপরের দিকে অ্যানিমেট;

    self.topConstraint.constant = -100;    
    [self.viewToAnimate setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded]; 
    }];

মূল জায়গায় ফিরে অ্যানিমেট করুন

    self.topConstraint.constant = 0;    
    [self.viewToAnimate setNeedsUpdateConstraints];  
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded];
    }];

2
কি দারুন!! এটি আসলে কাজ করে! এই উত্তরটি আমার জন্য চক্ষু খোলার ছিল। আপনাকে অনেক ধন্যবাদ! - এরিক
এরিক ভ্যান ডের নিউট

2
@ ইরিকভান্ডারনুট এটি আমার পক্ষেও ছিল, আনন্দিত যে এটি সহায়ক ছিল। আমি ফ্রেম অবস্থানের চেয়ে এখন থেকে অ্যানিমেশন সীমাবদ্ধতা হতে চলেছি।
ডিভিসি

যোগ করতে ভুলবেন না: [ধারক ভিউ লেআউটআইফনেড]; এটি নিশ্চিত করে যে সমস্ত মুলতুবি বিন্যাস অপারেশনগুলি অ্যানিমেটেডডিউরেশন ব্লকের আগে সম্পন্ন হয়েছে।
ingconti

11

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


3

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


1

বেশিরভাগ লোকেরা তাদের দর্শনগুলিতে আইটেমগুলি বিন্যাস করতে অটোলেআউট ব্যবহার করে এবং অ্যানিমেশন তৈরি করতে লেআউট সীমাবদ্ধ করে mod

প্রচুর কোড ছাড়াই এটি করার একটি সহজ উপায় হ'ল আপনি স্টোরিবোর্ডে সঞ্জীবিত করতে চান এমন ইউআইভিউ তৈরি করা এবং তারপরে একটি লুকানো ইউআইভিউ তৈরি করা যেখানে আপনি ইউআইভিভিউ শেষ করতে চান। আপনি উভয় ইউআইভিউ যেখানে সেখানে থাকতে চান তা নিশ্চিত করতে আপনি xcode এ পূর্বরূপ ব্যবহার করতে পারেন। এর পরে, শেষ ইউআইভিউ লুকান এবং বিন্যাসের সীমাবদ্ধতাগুলি অদলবদল করুন।

আপনি যদি নিজে লিখতে না চান তবে এসবিপি নামক লেআউট সীমাবদ্ধতার অদলবদলের জন্য একটি পডফিল রয়েছে is

এখানে একটি টিউটোরিয়াল


0

এর IBOutlet referenceপরিবর্তে বেশি বাধা ব্যবহার করার দরকার নেই আপনি সরাসরি accessবা updateইতোমধ্যে প্রয়োগ বাধাটি হয় লাইব্রেরী ব্যবহার করে যে কোনও দৃষ্টিতে প্রয়োগ করতে পারেন Programmaticallyfrom এই গ্রন্থাগারটিও এর আচরণ পরিচালনা করে ।Interface BuilderKVConstraintExtensionsMasterCumulativeNSLayoutConstraint

ধারকভিউতে উচ্চতা সীমাবদ্ধ করতে

 CGFloat height = 200;
 [self.containerView applyHeightConstrain:height];

অ্যানিমেশন সহ ধারকভিউয়ের উচ্চতা সীমাবদ্ধতা আপডেট করতে

[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){
        if (expectedConstraint) {
            expectedConstraint.constant = 100;

            /* for the animation */ 
            [self.containerView  updateModifyConstraintsWithAnimation:NULL];
      }
    }];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.