#macos #cocoa #uiview #core-animation
#macos #какао #uiview #core-animation
Вопрос:
У меня есть очень простая анимация в iOS, которая изменяет вид, изменяет размер контейнера, чтобы он соответствовал другому виду, а затем возвращает этот другой вид обратно. Это довольно легко сделать и очень просто.
Я пытался сделать что-то очень похожее на это на OSX, но я не смог понять, как это сделать. Анимация в OSX кажется такой неуклюжей и сложной по сравнению с iOS.
Любая помощь была бы очень признательна!!
Спасибо! 🙂
// Fade out viewOne, resize frame to fit viewTwo, fade in viewTwo
[UIView animateWithDuration: 0.15
animations: ^{
[viewOne setAlpha:0.0];
}
completion: ^(BOOL finished) {
[UIView animateWithDuration: 0.2
animations: ^{
[self setFrame: [viewTwo frame]];
}
completion: ^(BOOL finished) {
[viewTwo setAlpha: 0.0];
[self addSubview: viewTwo];
[UIView animateWithDuration: 0.15
animations: ^{
[viewTwo setAlpha:1.0];
}];
}];
}];
Ответ №1:
Я написал небольшой класс, который использует блоки для выполнения по существу того же, что и выше, при использовании прокси-сервера animator на OSX.
Пожалуйста, обратите внимание, что этот класс не является потокобезопасным и не проходил никаких специальных или стрессовых тестов.
//Interface
@interface MZAnimator : NSObject{}
(void)animateWithDuration:(NSTimeInterval)duration
animation:(void (^)(void))animationBlock;
(void)animateWithDuration:(NSTimeInterval)duration
animation:(void (^)(void))animationBlock
completion:(void (^)(void))completionBlock;
@end
//Implementation
@interface MZAnimator ()
(void)runEndBlock:(void (^)(void))completionBlock;
@end
@implementation MZAnimator
(void)animateWithDuration:(NSTimeInterval)duration
animation:(void (^)(void))animationBlock
{
[self animateWithDuration:duration animation:animationBlock completion:nil];
}
(void)animateWithDuration:(NSTimeInterval)duration
animation:(void (^)(void))animationBlock
completion:(void (^)(void))completionBlock
{
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:duration];
animationBlock();
[NSAnimationContext endGrouping];
if(completionBlock)
{
id completionBlockCopy = [[completionBlock copy] autorelease];
[self performSelector:@selector(runEndBlock:) withObject:completionBlockCopy afterDelay:duration];
}
}
(void)runEndBlock:(void (^)(void))completionBlock
{
completionBlock();
}
@end
Комментарии:
1. Хорошее решение 🙂 Чтобы сделать ее еще более похожей,
UIView
это можно было бы реализовать как категориюNSView
; анимации затем вызывались бы как методы классаNSView
.2. Отличная идея! Несколько функций класса могли бы упростить и усовершенствовать использование. Спасибо!
3. Может быть, это работает. Но какие библиотеки мне нужны, чтобы сделать ее работоспособной?
4. Использование обработчика завершения текущего
NSAnimationContext
было бы намного проще, чем отправка таймера, что может быть действительно неточным.
Ответ №2:
Вы можете использовать:
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setDuration:2.0];
//Animation code
} completionHandler:^{
//Completion Code
NSLog(@"Completed");
}];
Комментарии:
1. Я пробовал это и его мусор. Это так медленно и отстает, и при использовании с такими объектами, как NSButtons, цвет фона исчезает при запуске анимации.