0

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

4

2 に答える 2

3

これを行う簡単な方法は、[UIView transitionWithView] を使用することです。

[UIView transitionWithView:self.flipButton
                  duration:0.8
                   options:displayingFirstButton ? UIViewAnimationOptionTransitionFlipFromLeft : UIViewAnimationOptionTransitionFlipFromRight
                animations:^{
                  //change image for button
                }
                completion:^(BOOL finished) {

                }];
于 2013-08-16T18:43:56.570 に答える