アプリケーションの1つに対して、自動レイアウトに適した分割ビュークラスを作成しています。そのさまざまな機能の中には、NSSplitViewと同じように、ペインを折りたたんだり、折りたたんだりすることができるというものがあります。
制約を使用しているので、必要なwidth =(現在の幅)制約をペインに配置し、アニメーション化された方法で制約の定数を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に期間を設定しても効果はありません。
私がここで間違っている可能性があることについて何か考えはありますか?