ios - هل NSLayoutConstraints متحركة؟




animation autolayout (3)

طريقة Apple المقترحة هي مختلفة قليلاً ( انظر المثال في قسم "تنشيط التغييرات المتحركة بواسطة التصميم التلقائي" ). تحتاج أولاً إلى استدعاء layoutIfNeeded قبل الرسوم المتحركة. ثم أضف أشياء الرسوم المتحركة الخاصة بك داخل كتلة الرسوم المتحركة ثم اتصل على layoutإلنفيد في النهاية مرة أخرى. بالنسبة إلى الأشخاص من أمثالي الذين ينتقلون إلى autolayout ، فإن أسلوبه الأكثر تشابهًا مع الرسوم المتحركة السابقة التي كنا نفعلها مع الإطارات داخل كتل الرسوم المتحركة. نحتاج فقط إلى الاتصال layoutIfNeeded مرتين - قبل الرسوم المتحركة وبعد الرسوم المتحركة:

[self.view layoutIfNeeded]; // Ensures that all pending layout operations have been completed

[UIView animateWithDuration:1.0f animations:^{

  // Make all constraint changes here
  self.heightFromTop.constant= 550.f;

  [self.view layoutIfNeeded]; // Forces the layout of the subtree animation block and then captures all of the frame changes

}];

هذا السؤال لديه بالفعل إجابة هنا:

أحاول تحريك بعض وجهات النظر بحيث يتم حظرها بواسطة لوحة المفاتيح العملاقة في المشهد. إنه يعمل بشكل جيد إذا قمت ببساطة بتحريك الإطارات ، لكن الآخرين قد اقترحوا أن هذا الأمر سيؤدي إلى نتائج عكسية ويجب أن أقوم بتحديث NSLayoutConstraints بدلاً من ذلك. ومع ذلك ، لا يبدو أنها قابلة للرسوم المتحركة. هل حصل أحدهم على العمل بنجاح؟

//heightFromTop is an NSLayoutConstraint referenced from IB
[UIView animateWithDuration:0.25 animations:^{
    self.heightFromTop.constant= 550.f;
}];

والنتيجة هي قفزة فورية إلى الارتفاع المعني.


فقط اتبع هذا النموذج بالضبط:

self.heightFromTop.constant = 550.0f;
[myView setNeedsUpdateConstraints];

[UIView animateWithDuration:0.25f animations:^{
   [myView layoutIfNeeded];
}];

حيث myView هي وجهة نظر حيث تمت إضافة self.heightFromTop إلى. العرض الخاص بك هو "القفز" لأن الشيء الوحيد الذي فعلته في كتلة الرسوم المتحركة هو تعيين القيد ، والذي لا يسبب تخطيطات على الفور. في التعليمة البرمجية الخاصة بك ، يحدث التخطيط في حلقة التشغيل التالية بعد تعيين heightFromTop.constant ، وبحلول ذلك الوقت تكون بالفعل خارج نطاق كتلة الرسوم المتحركة.

في سويفت 2:

self.heightFromTop.constant = 550
myView.setNeedsUpdateConstraints()

UIView.animateWithDuration(0.25, animations: {
   myView.layoutIfNeeded()
})

لقد جربت أسلوب Centurion @ ، لكن بطريقة ما ، كان رأيي متحركًا في إطار خاطئ إذا تم تحميله من لوحة العمل. تختفي المشكلة إذا قمت باستبدال layoutIfNeeded updateConstraintsIfNeeded كنت layoutIfNeeded إلى updateConstraintsIfNeeded ، على الرغم من عدم وجود أي فكرة عن السبب. إذا كان أي شخص يمكن أن يعطي تفسيرا أنه سيكون موضع تقدير كبير.

[self.view updateConstraintsIfNeeded];
[UIView animateWithDuration:1.0 animations:^{
    self.myConstraint.constant= 100;
    [self.view layoutIfNeeded];
}];




autolayout