1049 Stimmen

Wie animiere ich Bindungsänderungen?

Ich aktualisiere eine alte Anwendung mit einer AdBannerView und wenn es keine Werbung gibt, wird sie ausgeblendet. Wenn eine Anzeige vorhanden ist, wird sie auf den Bildschirm geschoben. Grundlegende Dinge.

Im alten Stil habe ich den Rahmen in einen Animationsblock gesetzt. Neuer Stil, ich habe eine IBOutlet zur Auto-Layout-Beschränkung, die die Y Position, in diesem Fall den Abstand vom unteren Rand der Superview, und ändern Sie die Konstante:

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

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

Und das Banner bewegt sich, genau wie erwartet, aber keine Animation.


UPDATE: Ich habe mir die WWDC 12-Talk Best Practices für die Beherrschung des automatischen Layouts die sich mit Animation befasst. Es wird erörtert, wie man Beschränkungen mit CoreAnimation :

Ich habe es mit dem folgenden Code versucht, erhalte aber genau die gleichen Ergebnisse:

- (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;
}

Nebenbei bemerkt, ich habe das mehrfach überprüft und es wird auf dem メイン Thema.

3voto

D.D. Punkte 333

Es gibt einen Artikel, der darüber berichtet: http://weblog.invasivecode.com/post/42362079291/auto-layout-and-core-animation-auto-layout-was

Darin kodiert er folgendermaßen:

- (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];
        }];
    }
}

Ich hoffe, es hilft.

1voto

ivanferdelja Punkte 63

Im Zusammenhang mit der Animation von Beschränkungen möchte ich eine spezielle Situation erwähnen, in der ich eine Beschränkung sofort innerhalb einer keyboard_opened-Meldung animiert habe.

Constraint definiert einen oberen Abstand von einem Textfeld zum oberen Rand des Containers. Beim Öffnen der Tastatur teile ich die Konstante einfach durch 2.

Es ist mir nicht gelungen, direkt in der Tastaturbenachrichtigung eine gleichmäßige, flüssige Animation der Einschränkungen zu erreichen. Etwa die Hälfte der Zeit Ansicht würde nur an seine neue Position springen - ohne Animation.

Mir kam der Gedanke, dass durch das Öffnen der Tastatur ein zusätzliches Layouting stattfinden könnte. Hinzufügen einer einfachen dispatch_after-Block mit einer 10ms Verzögerung machte die Animation jedes Mal laufen - kein Springen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X