MOXY用に編集。
上部に画像が表示されたボタンの配列と、ビューが背景色のボタンの配列があります。ボタンをクリックすると、そのボタンインデックスを取得し、そのインデックスを使用して他のビューの適切な背景色も取得します。その情報を使用して、ボタンを(画像とともに)反転し、「裏返し」にします。背景色を明らかにします。
私の画面の構成は、ViewControllersView-> TileView->(ボタンの配列)です。
-(void)viewDidAppear:(BOOL)animated{
_viewContents = [model getRequestedView]; //this retrieves an array of UIButtons(24
//of them) whose frames and background colors have already been initialized to fit
//within the TileView.
_viewFrontImageContents =[model getRequestedViewFrontCardImagesWithFrame:_viewContents];
for(int screenViewIndex = 0; screenViewIndex < [_viewContents count]; screenViewIndex++){
[TileView addSubview:[_viewFrontImageContents objectAtIndex:screenViewIndex]];
[[_viewFrontImageContents objectAtIndex:screenViewIndex] addTarget:self action:@selector(frontOfCardPushed:) forControlEvents:UIControlEventTouchUpInside];
//[TileView addSubview:[_viewContents objectAtIndex:screenViewIndex]];
//[[_viewContents objectAtIndex:screenViewIndex] addTarget:self action:@selector(frontOfCardPushed:) forControlEvents:UIControlEventTouchUpInside];
}
}
//getRequestedViewFrontCardImagesWithFrameメソッド
-(NSMutableArray *)getRequestedViewFrontCardImagesWithFrame:(NSArray *)views{
NSMutableArray *cards = [[NSMutableArray alloc] init];
UIImage *frontOfCardImage = [UIImage imageNamed:@"Back_of_Tile"];
UIButton *frontOfCardView;
for(int viewIndex = 0; viewIndex < [views count]; viewIndex++){
frontOfCardView = [[UIButton alloc] initWithFrame:[[views objectAtIndex:viewIndex] frame]];
frontOfCardView.backgroundColor = [UIColor colorWithPatternImage:frontOfCardImage];
//setting the tag of each frontCard to match the view index to keep them aligned.
frontOfCardView.tag = viewIndex;
[cards addObject:frontOfCardView];
if(viewIndex == 0){
NSLog(@"first frontcard frame %@, first _viewContentsFrame %@", [cards objectAtIndex:0], [views objectAtIndex:0]);
}
}
return cards;
}
上記では、「トランプの前面」を表すために、上部に画像が付いたUIButtonを追加しています。上記のボタンのインデックスは、_viewContents配列のインデックスと正確に一致します。各ボタンは、すでに初期化されているボタンのフレーム(サイズと場所)と一致するように設定しました。
-(IBAction)frontOfCardPushed:(id)sender{
int containerViewIndex = -1;
UIButton *pressedButton = (UIButton *)sender;
NSLog(@"Button Index: %i", pressedButton.tag);
containerViewIndex = pressedButton.tag;
UIView *container = [TileView viewWithTag:containerViewIndex];
UIView *viewToShow = [_viewContents objectAtIndex:containerViewIndex];
NSLog(@"container: %@, viewToShow: %@", container, viewToShow);
//viewToShow.frame = container.frame;
//NSLog(@"container: %@, viewToShow: %@", container, viewToShow);
[UIView transitionWithView:container duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight
animations:^{
[sender removeFromSuperview];
[container addSubview:viewToShow];
}
completion:nil];
私がやりたいのは、トランジションを使用することです。つまり、「UIViewAnimationTransitionFlipFromRight」を押したときに「カードを反転」して、関連する_viewContents配列の内容を表示します。また、ユーザーがカードを裏返してfrontCardButtonの画像を表示できるようにしたいと思います。上記のこのコードは、コードの壁を避けるために、カードの最初の裏返しに焦点を当てています。
適切な背景色が表示されていますが、アニメーション自体が機能していません。
何が間違っているのでしょうか。また、このコードを機能させるには、このコードに何を追加/削除する必要がありますか?
- 編集*Moxyに以下で説明するように、getRequestedViewFrontCardImagesWithFrameメソッドのwhatsの出力を見てください。最初のカードの出力を確認してから、適切なタグを使用してビューを要求した後、frontCardPushed:メソッドでコンテナビューの出力を確認します。これらは一致しません。最初のTileViewサブビューに到達していることがわかるように、ボタンのインデックスを印刷しています。_viewContentsビューのタグは、色を表すタグセットであり、getRequestedViewFrontCardImagesWithFrameメソッドで割り当てたTileViewタグとは関係ありません。しかし、印刷時に最初のボタンにタグを割り当てた直後に、タグが表示されないのは不可解です。
出力:
//why doesnt the first frontcard frame list a tag? I had just assigned it one?
最初のフロントカードフレームUIButton:0x1c53f020; フレーム=(6 5; 145 145); 不透明=いいえ; layer = CALayer:0x1c534ac0、最初の_viewContentsFrame UIButton:0x1d045220; フレーム=(6 5; 145 145); 不透明=いいえ; タグ=3; レイヤー=CALayer:0x1d04535
ボタンインデックス:0
コンテナ:UIView:0x1c53a400; フレーム=(51 83; 922 614); ClipsToBounds = YES; 自動サイズ変更=W+ H; gestureRecognizers = NSArray:0x1d05afe0>; layer = CALayer:0x1c53a460、viewToShow:UIButton:0x1d045220; フレーム=(6 5; 145 145); 不透明=いいえ; タグ=3; レイヤー=CALayer:0x1d045350