雑種のポメラニアン

フリープログラマーの日記とか人生観とか綴るよ

iPhoneでビューの切替え


もう徹夜続きで(昼寝てますが)iPhone開発の本の2.8章をやってました。
(もう数日頑張ってますが、まだ78ページか・・・)
本の通りにやっても綺麗に切替えられなかったので、一晩中ネットで調べてた。
どれもしっくりこなくて調べに調べた結果
やっとこさ画像のようになりました。

ViewControllerに下記イベントを作成しました。


ー (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGContextRef context = UIGraphicsGetCurrentContext();

[UIView beginAnimations:nil context:context];

if (isOne) {
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:imgView2 cache:NO];
[UIView setAnimationDelegate:self];
[UIView animateWithDuration:0.05 animations:^{
} completion:^(BOOL finished) {
if (finished) {
imgView2.alpha = 255.0f;
imgView1.alpha = 255.0f;
[self.view bringSubviewToFront:imgView2];
imgView2.alpha = 0.0f;
isOne = !isOne;
}
}];
} else {
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:imgView1 cache:NO];
[UIView setAnimationDelegate:self];
[UIView animateWithDuration:0.05 animations:^{
} completion:^(BOOL finished) {
if (finished) {
imgView1.alpha = 255.0f;
imgView2.alpha = 255.0f;
[self.view bringSubviewToFront:imgView1];
imgView1.alpha = 0.0f;
isOne = !isOne;
}
}];
}

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:1.0f];

//[ [self.view superview] exchangeSubviewAtIndex:0 withSubviewAtIndex:1];//debug

[UIView commitAnimations];
}

本がダメだったのは主に


[ [self.view superview] exchangeSubviewAtIndex:0 withSubviewAtIndex:1];

の部分で、とにかくサブビューが交換されない。
多分本のミスじゃなくてUIKitのバグだと思われます。
とにかくexchangeSubviewAtIndexが使えないので
ネットでうまい方法を調べて色々試した成果が下記です。


[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:imgView2 cache:NO];
[UIView setAnimationDelegate:self];
[UIView animateWithDuration:0.05 animations:^{
} completion:^(BOOL finished) {
if (finished) {
imgView2.alpha = 255.0f;
imgView1.alpha = 255.0f;
[self.view bringSubviewToFront:imgView2];
imgView2.alpha = 0.0f;
isOne = !isOne;
}
}];


[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:imgView2 cache:NO];

のcacheをNOにするのがミソです。更に


[UIView animateWithDuration:0.05 animations:^{
} completion:^(BOOL finished) {
if (finished) {

の内側でビューを手前に移動する前後で透明度を変えるのが大変重要です。

これはネットを調べてあれこれ試している内に偶然発見しました。

いや〜疲れたけど、結果には満足満足!
明日も頑張るぞ〜!!!