내 응용 프로그램 중 하나에 대해 자동 레이아웃 지원 뷰 분할 클래스를 만들고 있습니다. 다양한 기능 중 하나는 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으로 더 잘 작동하도록 재 설계되었습니다. –
오, 잡았다. [redacted]와 관련하여 자동 레이아웃과 관련하여 좋은 점이 있지만 이전 목표와 역 호환되지는 않습니다. 오 잘, 나는 내가 추측 할 수있게 할 것이다! :) –