문제

내 응용 프로그램 중 하나에 대해 자동 레이아웃 친화적 인 분할 클래스를 작성합니다.다양한 기능 중에는 붕괴 할 수 있으며 nssplitview가 수행하는 것처럼 콜라프를 애니메이션을 사용할 수 있습니다.

제약 조건을 사용하고 있기 때문에 필수 너비= (현재 너비) 제약 조건을 창에 배치 한 다음 제약 조건의 상수를 애니메이션 방식으로 0으로 설정하여이를 달성합니다.

- (NSLayoutConstraint*)newHiddenConstraintAnimated:(BOOL)animated {
    NSLayoutConstraint * constraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:NSWidth(self.view.frame)];
    constraint.priority = NSLayoutPriorityRequired;

    CABasicAnimation * anim = [CABasicAnimation animation];
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    anim.duration = 0.2;
    constraint.animations = [NSDictionary dictionaryWithObject:anim forKey:@"constant"];

    [self.view addConstraint:constraint];

    [(animated ? constraint.animator : constraint) setConstant:0.0];

    return constraint;
}
.

이것은 아름답게 작동합니다.불행히도, 나중에 창을 확장하는 것은

- (void)removeHiddenConstraintAnimated:(BOOL)animated {
    if(!animated) {
        [self.view removeConstraint:self.hiddenConstraint];
    }
    else {
        NSLayoutConstraint * constraint = self.hiddenConstraint;
        NSView * theView = self.view;

        [NSAnimationContext beginGrouping];

        [constraint.animator setConstant:self.width];

        [NSAnimationContext currentContext].completionHandler = ^{
            [theView removeConstraint:constraint];
        };

        [NSAnimationContext endGrouping];
    }

    self.hiddenConstraint = nil;
}
.

일부 타이밍 코드를 삽입하면 완료 핸들러가 거의 즉시 즉시 발생하는지 알 수 있으므로 애니메이션을 사용할 시간이 있기 전에 제약 조건을 제거합니다.nsanimationContext에서 지속 시간을 설정하는 것은 효과가 없습니다.

여기서 내가 무엇을 잘못 할 수 있는지 알아 낸 것입니까?

도움이 되었습니까?

해결책

먼저 완료 핸들러를 설정하고 메시지를 Animator 프록시로 보내야합니다.그렇지 않으면 애니메이션이 시작된 후 완료 핸들러를 설정하는 것으로 보이고 애니메이션이 끝내기 전에 상수가 제거됩니다. 나는 단순한 코드 조각으로 이것을 확인했다.

[NSAnimationContext beginGrouping];
NSAnimationContext.currentContext.duration = animagionDuration;
NSAnimationContext.currentContext.completionHandler = ^{
  [self removeConstraint:collapseConstraint];
};
[collapseConstraint.animator setConstant:expandedHeight];
.

[nsAnimationContext EndGrouping]; 이는 완벽하게 작동하지만 -setConstant: 후에 완료 처리기를 설정하면 애니메이션에 실행할 기회가 없습니다.

다른 팁

나는 동의한다, 이것은 꽤 이상하고, 그건 버그가 될 수있다.나는 그것이 나의 지식의 최선을 위해,이 일해야하기 때문에 확실히 그것을 확실히보고한다.

NSAnimationContext+runAnimationGroup:completionHandler: 문 대신 beginGrouping 클래스 메소드 메소드 endGrouping를 사용하여 작업 할 수있었습니다.

[NSAnimationContext runAnimationGroup:^(NSAnimationContext* context){
    [constraint.animator setConstant:self.width];   
} completionHandler:^(void){
    [theView removeConstraint:constraint];
    NSLog(@"completed");
}];
.

완료 핸들러는 실행 해야하는 애니메이션이 없다고 생각되므로 즉시 발사됩니다.작성한 애니메이션이 여전히 뷰에 연결되어 있는지 확인하고 확인합니다.기본적으로 Caanimation에서 상속받은 ReadureOnCompletion 속성을 통해 완료되면 CabasicAnimation은 Caanimation (기본적으로 예로 설정된 것으로 설정)을 상속 받아야합니다.

를 원할 것입니다.

anim.removedOnCompletion = NO;
.

나는이 물건을 나 자신으로 그립로 가고 있기 때문에 이것은 순진한 분석 일 수 있지만,

다른 블록에서 제약 조건의 속성에 대한 애니메이션이 애니메이션에 대한 애니메이션을 지정하고있는 것으로 보입니다. 그런 다음 애니메이션에 기회가있는 경우 즉시 제약 조건 (잠재적으로 해제)을 즉시 설정하십시오.달리기.

나는 당신이 애니메이션 완료 블록 내에서 또는 트리거 된 HidDenConstraint를 nil로 설정하려는 것이 좋습니다.

가능성이있는 바와 같이, 나는 잘못 이해하는 것과 같아지는 이유를 더 잘 이해하는 데 도움이되는 이유를 고맙게 생각합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top