私は、自分のアプリケーションの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の継続時間を設定しても効果はありません。
私はここで間違っていますか?
この分割ビュークラスを終了しましたか?オープンソース化の可能性は? –
私は現時点では計画していません。このアプリケーションにはかなり専門的ですが、[PURRDACTED]の 'NSSplitView'がautolayoutでうまく動作するように再設計されていると思います。 –
ああ、つかまります。 [編集]に関しては、自動レイアウトに関して優れた機能を持っていますが、もちろん古いターゲットとの後方互換性はありません。ああ、私は自分のことを推測するよ! :) –