2017-10-26 4 views
0

I uiview benutzerdefinierte Klasse und implementiert in Main-View-ControllerConstraints Animation ist falsch

-(KPHomeChartCategory *)chartCategory { 

    if (!_chartCategory) { 
    _chartCategory = [[KPHomeChartCategory alloc] init]; 
    _chartCategory.delegate = self; 
    _chartCategory.translatesAutoresizingMaskIntoConstraints = NO; 
    [self addSubview:_chartCategory]; 

    [self.chartCategory.topAnchor constraintEqualToAnchor:self.topAnchor constant:-7.5].active = YES; 
    [self.chartCategory.rightAnchor constraintEqualToAnchor:self.rightAnchor].active = YES; 

    self.chartCategoryLeftAnchor = [self.chartCategory.leftAnchor constraintEqualToAnchor:self.rightAnchor]; 
    self.chartCategoryLeftAnchor.active = YES; 

    [self.chartCategory.heightAnchor constraintEqualToConstant:100].active = YES; 

    } 
    return _chartCategory; 
} 

habe ich uiview benutzerdefinierte Klasse (KPHomeChartCategory) Einschränkungen auf diese Weise

-(void)openPanelTagAnimation { 

    self.chartCategoryLeftAnchor.active = NO; 
    self.chartCategoryLeftAnchor = [self.chartCategory.leftAnchor constraintEqualToAnchor:self.rightAnchor constant:-self.frame.size.width +105]; 
    self.chartCategoryLeftAnchor.active = YES; 

    [UIView animateWithDuration:.6 delay:0 usingSpringWithDamping:1 initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     self.customSwitch.alpha = 0; 
     [self layoutIfNeeded]; 
    } completion:nil]; 
} 

Jetzt animiert, wenn Sie schauen Im Video werden Sie feststellen, dass bei der ersten Anzeige von customView die Ansicht meiner Sammlung von oben angezeigt wird, aber danach scheint die Animation vollkommen unkompliziert zu sein ... können Sie mich verstehen lassen, warum dieses Ding?

Video Link
VIDEO ANIMATION

Warum meine Animation zuerst von oben nach unten beginnt und erst dann linear? (die lineare Animation von rechts nach links ist die richtige und sollte das erste Mal sein, dass die benutzerdefinierte Ansicht animiert wird)

Antwort

1

In der Animation, die Sie gepostet haben, animieren die Zellen, weil ihre ursprüngliche Größe CGSizeZero oder ein Wert nahe und ist dann wird das Layout der Sammlungsansicht ungültig, sodass ihre Größe erhöht wird. Sie können dies vermeiden, indem Sie die transform-Eigenschaft Ihrer Sammlungsansicht animieren. Dies wird das Problem lösen, das Sie auch erwähnen here. Zum Beispiel kann ich in einer einfachen Demo eine Kollektionsansicht platzieren, indem ich oben, links und rechts mit einer konstanten Höhe an die Superansicht angeheftet bin. Ich habe die Zellengrößen programmatisch mögen:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return CGSizeMake(collectionView.bounds.size.width/3.0, collectionView.bounds.size.height); 
} 

Dann benutze ich eine CGAffineTransform die Sammlung zu bewegen Bildschirm anzuzeigen aus. Zum Beispiel:

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    self.collectionView.transform = CGAffineTransformTranslate(CGAffineTransformIdentity, self.view.bounds.size.width, 0.0); 
} 

Schließlich, wenn ich möchte eine Animation auszuführen, habe ich die auf seine Identität zurückzuverwandeln:

- (void)animate { 
    // Reversing and repeating for the sake of testing 
    [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{ 
     self.collectionView.transform = CGAffineTransformIdentity; 
    } completion:nil]; 
} 

Mit diesem Verfahren wird sichergestellt, dass Zellen sind immer gleich groß und damit gewonnen nicht animieren, wenn sich die Bedingungen in einem Animationsblock ändern.

Wenn ich Einschränkungen in meinem Demo-Projekt ändern, ist dies die Animation, beachten Sie, dass sich die Zellengrößen bei der anfänglichen Animation ändern.

enter image description here

Die gleiche Animation bei der Einstellung transform:

enter image description here

+0

beyowulf hallo ... ich Ihre Methode korrekt umgesetzt haben, und jetzt funktioniert es perfekt .. ich Ihnen für Ihre Hilfe bedanken ... Ich habe eine Animation mit einem booleschen Wert tagPanelIsOpen: (BOOL) open ... ich wollte Sie fragen, ob CGAffineTransformIdentity ich es eingeben muss, wenn der Wert JA ist und wenn der Wert NEIN ist? oder nur wenn der Wert JA ist? – kAiN

+0

Denken Sie, dass es "CGAffineTransformIdentity" sein soll, wenn das Panel vollständig auf dem Bildschirm angezeigt werden soll und gleich der Übersetzung sein soll, wenn Sie außerhalb des Bildschirms sein möchten. – beyowulf

+0

Naja ... dann vorher show (vorher Constraint Change) und vorher ausblenden ... oder? – kAiN