2012-02-29 6 views
14

私は、自分のアプリケーションの1つに自動レイアウト対応の分割ビュークラスを作成しています。さまざまな機能の中で、NSSplitViewで見たように、ペインを折りたたんで、折りたたみをアニメーション化できます。NSLayoutConstraint.constantアニメーションを無視します。

私は制約を使用していますので、私はペイン上必要な幅=(現在の幅)制約を置き、その後、アニメーション形式で制約の定数を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の継続時間を設定しても効果はありません。

私はここで間違っていますか?

+0

この分割ビュークラスを終了しましたか?オープンソース化の可能性は? –

+0

私は現時点では計画していません。このアプリケーションにはかなり専門的ですが、[PURRDACTED]の 'NSSplitView'がautolayoutでうまく動作するように再設計されていると思います。 –

+0

ああ、つかまります。 [編集]に関しては、自動レイアウトに関して優れた機能を持っていますが、もちろん古いターゲットとの後方互換性はありません。ああ、私は自分のことを推測するよ! :) –

答えて

15

あなたが最初の完了ハンドラを設定するだけにしてにメッセージを送信してきましたアニメータプロキシそれ以外の場合は、アニメーションの開始後に完了ハンドラを設定すると、すぐにアニメーションが起動され、アニメーションが終了する前に定数が削除されたように見えます。 は、私はシンプルなコードの一部でこれを確認しています

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

をこれは完璧に動作しますが、あなたは-setConstant:後に完了ハンドラを設定した場合、アニメーションを実行する機会を持っていません。

+0

うわー、それは本当にうまくいった。ヒントをありがとう! –

+0

まったくそうではありませんでしたが、私は同じ問題にぶつかりました。 – skh

1

私はちょうど自分自身がそう、これはナイーブ分析することができるが、このようなものでグリップを取得していますが:

あなたが指定しているように私には思われる(あなたのelseブロック内)制約のプロパティのアニメーションアニメーションが実行される前に、制約への参照をnilに設定する(潜在的に解放する)ようにします。

アニメーション補完ブロック内でhiddenConstraintをnilに設定するか、アニメーション補完ブロックでトリガーすることが望ましいと思います。

可能性があるとして、場合、私は間違っている私は私がそれをよりよく理解するために理由について単語または2を認めることに注意してください:)

+0

ビューには、追加する制約があると仮定するのが妥当です。したがって、制約が 'hiddenConstraint'プロパティで参照されていなくても、ビューの制約のリストによって参照される必要があります。また、ブロックはあなたが使用するオブジェクト変数の値を保持するので、ブロック自体によっても保持されます。 –

+0

Peterが述べたように、「制約」は強い参照であり、ブロックによって捕捉され、ビューでない場合でも制約が保持されます。適度に複雑なオートレイアウトには何百もの制約があり、大多数はそれらを所有するビューによってのみ参照されます。 –

+0

お世話になりました。 –

3

それはいずれかが存在しないと考えているため、完了ハンドラはすぐに発射されますアニメーションを実行する必要があります。作成したアニメーションがまだビューにアタッチされていることを確認して確認します。デフォルトでは、CABasicAnimationはCAAnimationから継承したremovedOnCompletionプロパティ(デフォルトではYESに設定されています)によって完了時に自身を削除するように設定されています。

あなたは、私が同意

anim.removedOnCompletion = NO; 
+0

'anim.removedOnCompletion = NO;'を追加しても効果はありません。しかし、良い提案。 –

12

したいと思う、これはかなり奇妙で、よくバグである可能性があります。私は間違いなくこのように報告しています。なぜなら、私の知る限りでは、になるはずです。

私はそれが代わりにbeginGroupingendGrouping文のNSAnimationContextクラスメソッド+runAnimationGroup:completionHandler:を使って仕事を得ることができました:

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

ああ、これは私のコードには影響していないようです。私はおそらく、レーダーを提出するでしょう。これは確かに働くべきであるように思えます。 –

+0

これは奇妙です。それは間違いなくここでうまくいきます。 –

+0

私にも働きました。 – stevex

関連する問題