为 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;
}
上面我添加了 UIButtons,上面有一个图像来表示“扑克牌的正面”。所述按钮的索引与 _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 方法中的输出。查看第一张卡片的输出,然后查看 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); 不透明=否;层=CALayer:0x1c534ac0,第一个_viewContentsFrame UIButton:0x1d045220;帧 = (6 5; 145 145); 不透明=否;标签 = 3; 层=CALayer:0x1d04535
按钮索引:0
容器:UIView:0x1c53a400;帧 = (51 83; 922 614); clipsToBounds = YES; 自动调整大小 = W+H;手势识别器 = NSArray: 0x1d05afe0>; 层=CALayer:0x1c53a460,viewToShow:UIButton:0x1d045220;帧 = (6 5; 145 145); 不透明=否;标签 = 3; 层=CALayer:0x1d045350