[ios] كيف يمكنني تحريك التغييرات القيد؟



5 Answers

أقدر الإجابة المقدمة ، لكنني أعتقد أنه سيكون من الجميل أن تأخذها إلى أبعد من ذلك بقليل.

الرسوم المتحركة كتلة الأساسية من الوثائق

[containerView layoutIfNeeded]; // Ensures that all pending layout operations have been completed
[UIView animateWithDuration:1.0 animations:^{
     // Make all constraint changes here
     [containerView layoutIfNeeded]; // Forces the layout of the subtree animation block and then captures all of the frame changes
}];

لكن هذا حقا سيناريو بسيط جدا. ماذا لو كنت أرغب في تحريك قيود العرض updateConstraints من خلال طريقة updateConstraints ؟

كتلة رسوم متحركة تستدعي طريقة updateConstraints

[self.view layoutIfNeeded];
[self.subView setNeedsUpdateConstraints];
[self.subView updateConstraintsIfNeeded];
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionLayoutSubviews animations:^{
    [self.view layoutIfNeeded];
} completion:nil];

يتم تجاوز أسلوب updateConstraints في الفئة الفرعية UIView ويجب استدعاء super في نهاية الأسلوب.

- (void)updateConstraints
{
    // Update some constraints

    [super updateConstraints];
}

يترك دليل AutoLayout الكثير ليكون مرغوبًا ولكن الأمر يستحق القراءة. أنا نفسي أستخدم هذا كجزء من برنامج UISwitch الذي يبدل عرضًا UISwitch مع زوج من UITextField مع رسم UITextField بسيط ودقيق (بطول 0.2 ثانية). يتم التعامل مع قيود العرض الفرعي في طرق UCiew لتحديث الفئات الفرعية كما هو موضح أعلاه.

Question

أعمل على تحديث تطبيق قديم باستخدام AdBannerView وعندما لا يكون هناك إعلان ، يتم إيقافه. عندما يكون هناك إعلان ينزلق على الشاشة. الاشياء الاساسية.

النمط القديم ، أنا وضعت الإطار في كتلة الرسوم المتحركة. نمط جديد ، لدي IBOutlet إلى القيد الذي يحدد الموقع Y ، في هذه الحالة يكون المسافة من أسفل المنظر العلوي ، وتعديل الثابت.

- (void)moveBannerOffScreen {
    [UIView animateWithDuration:5
             animations:^{
                          _addBannerDistanceFromBottomConstraint.constant = -32;
                     }];
    bannerIsVisible = FALSE;
}

- (void)moveBannerOnScreen {
    [UIView animateWithDuration:5
             animations:^{
                         _addBannerDistanceFromBottomConstraint.constant = 0;
             }];
    bannerIsVisible = TRUE;
}

وتتحرك اللافتة ، تمامًا كما هو متوقع ، ولكن بدون رسوم متحركة.

حدث: تمت إعادة مشاهدة فيديو WWDC12 " أفضل الممارسات لتخطيط التصميم التلقائي " والذي يشمل الرسوم المتحركة. يناقش كيفية تحديث القيود باستخدام CoreAnimation .

لقد حاولت مع التعليمات البرمجية التالية ، ولكن الحصول على نفس النتائج بالضبط.

- (void)moveBannerOffScreen {
    _addBannerDistanceFromBottomConstraint.constant = -32;
    [UIView animateWithDuration:2
                     animations:^{
                         [self.view setNeedsLayout];
                     }];
    bannerIsVisible = FALSE;
}

- (void)moveBannerOnScreen {
    _addBannerDistanceFromBottomConstraint.constant = 0;
    [UIView animateWithDuration:2
                     animations:^{
                         [self.view setNeedsLayout];
                     }];
    bannerIsVisible = TRUE;
}

في ملاحظة جانبية ، لقد تحققت عدة مرات ويتم تنفيذ ذلك على الموضوع الرئيسي.




حل العامل والمختبر للتو ل Swift 3 مع Xcode 8.3.3:

self.view.layoutIfNeeded()
self.calendarViewHeight.constant = 56.0

UIView.animate(withDuration: 0.5, delay: 0.0, options: UIViewAnimationOptions.curveEaseIn, animations: {
        self.view.layoutIfNeeded()
    }, completion: nil)

فقط ضع في اعتبارك أن self.calendarViewHeight هو قيد يشير إلى customView (CalendarView). اتصلت .layoutIfNeeded () على self.view وليس على self.calendarView

نأمل أن تكون هذه المساعدة.




حل سريع:

yourConstraint.constant = 50
UIView.animateWithDuration(1, animations: yourView.layoutIfNeeded)



حل العمل 100٪ سويفت 3.1

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

self.view.layoutIfNeeded() // Force lays of all subviews on root view
UIView.animate(withDuration: 0.5) { [weak self] in // allowing to ARC to deallocate it properly
       self?.tbConstraint.constant = 158 // my constraint constant change
       self?.view.layoutIfNeeded() // Force lays of all subviews on root view again.
}



هناك مقال يتحدث عن هذا: http://weblog.invasivecode.com/post/42362079291/auto-layout-and-core-animation-auto-layout-was

فيه ، مشفرة مثل هذا:

- (void)handleTapFrom:(UIGestureRecognizer *)gesture {
    if (_isVisible) {
        _isVisible = NO;
        self.topConstraint.constant = -44.;    // 1
        [self.navbar setNeedsUpdateConstraints];  // 2
        [UIView animateWithDuration:.3 animations:^{
            [self.navbar layoutIfNeeded]; // 3
        }];
    } else {
        _isVisible = YES;
        self.topConstraint.constant = 0.;
        [self.navbar setNeedsUpdateConstraints];
        [UIView animateWithDuration:.3 animations:^{
            [self.navbar layoutIfNeeded];
        }];
    }
}

آمل أن يساعد.




// Step 1, update your constraint
self.myOutletToConstraint.constant = 50; // New height (for example)

// Step 2, trigger animation
[UIView animateWithDuration:2.0 animations:^{

    // Step 3, call layoutIfNeeded on your animated view's parent
    [self.view layoutIfNeeded];
}];



Related