2

TL; DR 업데이트 : 기본적으로 iOS가 "앱 시작"애니메이션을 완료 할 때까지 코드를 지연시키는 것이 좋습니다.UIApplicationDidBecomeActiveNotification 및 setRightBarButtonItem : 애니메이션 :

내 앱이 활성화되면 탐색 바의 콘텐츠에 애니메이션을 적용하고 싶습니다. 내 컨트롤러에서 나는 UIApplicationDidBecomeActiveNotification에 가입하고 setRightBarButtonItem:animated:을 사용하여 변경 작업을 수행합니다.

문제는 애니메이션이 적용되지 않는다는 것입니다.

나는 약간의 실험을했으며 조금 기다리면 () 아무런 문제없이 움직이는 것을 발견했습니다. 내가 스레드를 차단 또는 고정 지연 후 변경 사항을 수행하는 것보다 더 나은 해결책을 찾을 싶습니다

@interface TESTViewController() 

@property (strong, nonatomic) IBOutlet UINavigationBar *navigationBar; 

@end 

@implementation TESTViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UINavigationItem *item = [UINavigationItem new]; 
    UIBarButtonItem *oldItem = [[UIBarButtonItem alloc] initWithTitle:@"Old" style:UIBarButtonItemStyleBordered target:nil action:NULL]; 
    [item setRightBarButtonItem:oldItem]; 
    [[self navigationBar] setItems:@[item] animated:NO]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil]; 
} 

- (void)applicationDidBecomeActiveNotificationAction:(NSNotification *)notification 
{ 
    // [NSThread sleepForTimeInterval:.3]; 
    UIBarButtonItem *newItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style:UIBarButtonItemStyleBordered target:nil action:NULL]; 
    [[[self navigationBar] items][0] setRightBarButtonItem:newItem animated:YES]; 
} 

@end 

:

다음은 문제를 보여주는 간단한 뷰 컨트롤러입니다.

+0

보기가 나타나기 전에 응용 프로그램이 '활성'상태가됩니다. 단순히 'applicationDidBecomeActiveNotificationAction'에서'viewDidAppear'으로 애니메이션 코드를 이동하지 마십시오. –

+2

@rokjarc 나는 사랑하고 싶습니다. 문제는 앱으로 다시 전환 할 때'viewDidAppear :'이 호출되지 않는다는 것입니다. BTW,'viewDidAppear :'name은 약간 오도 된 것입니다 (http : // stackoverflow를보십시오.com/questions/5417318/viewdidappear-not-firing-ever-again-after-app-enter-foreground)가 있습니다. –

+0

아, 네. 얼마 전에 그 해결 방법을 보았다는 것을 알고 있습니다. 나는 UINavigationController (뷰 계층 구조에서 사용되지 않더라도)와 관련이 있다고 믿는다. 그것을 찾으려고 노력할 것입니다. –

답변

4


+[NSThread sleepForTimeInterval:] 클래스 메서드를 호출하는 대신 dispatch_after을 주 큐에서 사용하기 만하면됩니다.

애니메이션을 블록으로 전달하면 완벽하게 작동합니다.

+1

변경 사항은 _ 다음에 수행되기 때문에 가능합니다. 즉, 다음 번 업데이트주기를 의미합니다. 이는 단지 일시적인 해결책 일 뿐이며, 내부 구현과 관련이 있으므로이를 수행하는 데있어 올바른 방법이 없습니다. – Tricertops

+0

실제로 해결 방법이 아닙니다. UI 스레드를 차단하지 않기 때문에'[NSThread sleepForTimeInterval :]'을 사용하는 것보다 훨씬 낫습니다. 트랜지션 측면에서 보면, 애니메이션이 제대로 시작될 수 있도록 (그리고 적절한 위치에서) 인 - 프로세스 애니메이션이 완료 될 수 있도록 작은 비트를 지연시키는 것이 필요합니다. 와'dispatch_after()'(또는'[obj performSelector : withObject : afterDelay :]')는 차단하지 않고 이것을 수행하는 방법입니다. –

+0

TL 추가, DR 업데이트. –

-1

applicationDidBecomeActiveNotificationAction: 메서드 내에서 수동으로 viewDidAppear:을 호출하십시오. 애니메이션 코드를 viewDidAppear: 메소드에 삽입하십시오. 희망이 도움이됩니다.

0

알림을 게시 할 때 귀하의 방법을 사용하지 않습니다.

내가 사용

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeButton) name:@"changeButton" object:nil]; 수신 끝.

그리고 게시 끝에

, 나는 [[NSNotificationCenter defaultCenter] postNotificationName:@"changeButton" object:nil];

메소드에 코드를 옮겨보십시오 전화 :

-(void)changeButton{

UIBarButtonItem *newItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style:UIBarButtonItemStyleBordered target:nil action:NULL];

[[[self navigationBar] items][0] setRightBarButtonItem:newItem animated:YES]; 

}

희망이 도움이!

0

SelectorAfterDelay를 수행하려고 시도 했습니까? 이 같은

시도 뭔가 :

- (void)applicationDidBecomeActiveNotificationAction:(NSNotification *)notification{ 
    [self performSelector:@selector(yourAnimationAction) withObject:nil afterDelay:1]; 
} 

- (void)yourAnimationAction{ 
    //Set your NavAnimation here 
    [self.navigationItem setRightBarButtonItem:theItem animated:TRUE]; 
} 

은 당신의 애플 리케이션이 지연 웨이크 업에 맞게 지연을 변경 ... 어쩌면이 효과를 걸릴까요?

0

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil];viewDidLoad: 방법으로 시도해보십시오. 나는 해고되는 동안 객체가 "UIApplicationDidBecomeActiveNotification"으로 등록되지 않았다고 생각한다.