私は、アニメーションブロック内の2つのビューを交換するアクションを呼び出すbarButtonItemを持っています。私はそれが呼び出すアクションメソッドの最初にbarButtonItem
を無効にし、終了時に有効にして、反転させる前にユーザーがビューを再び反転させることができないようにします。IPhoneのセレクタに引数を渡す
これはUIViewアニメーションブロックで行います。メソッドのnedで有効にすると、瞬時になり、アニメーションが終了する前に有効になるため、目的を破棄します。
このメソッドでは、送信者をUIBarButtonItemにキャストし、それを無効にします。だから私は[UIView setAnimationDidStopSelector:@selector()]
を見つけましたが、enableControlメソッドがこれを有効にするようにセレクタにbarButtonItemを渡す必要があります(これは非常に簡単ですが、匿名関数を作ることができます..)。
barButtonを引数として渡すにはどうすればよいですか?私はむしろ、このためだけにIVARをしなければならないだろう...ここでは、コードです:
- (void)barBtnItemSwitchViews_Clicked:(id)sender {
UIBarButtonItem *barButton = (UIBarButtonItem *)sender;
barButton.enabled = NO;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.8];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
if(!self.yellowVC.view.superview) {
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
[yellowVC viewWillAppear:YES];
[blueVC viewWillDisappear:YES];
[blueVC.view removeFromSuperview];
self.blueVC = nil;
[innerView addSubview:yellowVC.view];
} else if(!self.blueVC.view.superview) {
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
[blueVC viewWillAppear:YES];
[yellowVC viewWillDisappear:YES];
[yellowVC.view removeFromSuperview];
self.yellowVC = nil;
[innerView addSubview:blueVC.view];
}
[UIView commitAnimations];
[UIView setAnimationDidStopSelector:@selector(enableControl:)]; // How do I pass barButton??
}
- (void)enableControl:(UIControl *)control {
control.enabled = YES;
}
ここ
が、私はそれを変更するものですが、メソッドが呼び出されていません..私は何をやっています違う?
- (void)barBtnItemSwitchViews_Clicked:(id)sender {
UIBarButtonItem *barButton = (UIBarButtonItem *)sender;
barButton.enabled = NO;
[UIView beginAnimations:nil context:barButton];
[UIView setAnimationDuration:0.8];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
if(!self.yellowVC.view.superview) {
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
[yellowVC viewWillAppear:YES];
[blueVC viewWillDisappear:YES];
[blueVC.view removeFromSuperview];
self.blueVC = nil;
[innerView addSubview:yellowVC.view];
} else if(!self.blueVC.view.superview) {
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
[blueVC viewWillAppear:YES];
[yellowVC viewWillDisappear:YES];
[yellowVC.view removeFromSuperview];
self.yellowVC = nil;
[innerView addSubview:blueVC.view];
}
[UIView setAnimationDidStopSelector:@selector(flipViewAnimationDidStop:finished:context:)];
[UIView commitAnimations];
}
- (void)flipViewAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
UIBarButtonItem *barButton = (UIBarButtonItem *)context;
barButton.enabled = NO;
NSLog(@"Disabled");
}
編集:私はそれを考え出しました。ボタンをコンテキストにしてからsetAnimationDelegate:self
を実行し、次にsetAnimationDidEndSelector:@selector(myMethod:finished:context:)
を実行し、メソッドをuibarbuttonitem
にキャストして再度有効にしてください。
オリジナルの質問を削除しないでください。 –
元の質問を元に戻します。 – mk12