如何在点击/选择时替换 iCarousel 中的特定视图?
Posted
技术标签:
【中文标题】如何在点击/选择时替换 iCarousel 中的特定视图?【英文标题】:How to replace a specific view in iCarousel on tap/select? 【发布时间】:2016-05-17 12:23:09 【问题描述】:我正在使用@Nick Lookwood 的 iCarousel 来加载“抽认卡”的可滚动列表。
iCarousel 控件的每个视图都是一张抽认卡。根据设计,我要求当用户点击抽认卡(视图)时,抽认卡翻转以显示背后。在使用 iCarousel 之前,我制作了两个单独的控件,一个用于正面,一个用于背面,然后使用 UIView.Transition(带有漂亮的从顶部翻转动画)在检测到 Tap 时从前到后移动,或者以其他方式圆。
将 UITapGestureRecognizer 添加到我的视图会导致奇怪的伪影并且无法按预期运行(重叠控件、下一个而不是当前的翻转、没有动画等),我需要一种不同的方法。我可以方便地在 iCarousel Delegate 中使用 Selected 事件,而不是 Tap Gesture Recognizer,但我究竟应该在那儿做什么?
本质上,我想用另一个替换被挖掘的特定视图,但我觉得这与整个可重用视图的想法相冲突。我没有什么可以做的吗? (一旦视图离开屏幕,我就可以再次“向前翻转”。)
谢谢!
p
附:我正在使用 C# 和 Xamarin.ios,但我可以很好地理解 Obj-C 和 Swift 代码,因此将不胜感激。
【问题讨论】:
对于它的价值,iCarousel 并不真正关心您是否重用提供的视图。选择视图时不能只触发视图上的动画吗? 【参考方案1】:iCarausal 有很多例子。我假设你正在使用这个:
iCarausal
特别是文件夹名称“Basic iOS Example”
委托方法的以下变化如何:
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view
UILabel *label = nil;
//create new view if no view is available for recycling
if (view == nil)
//don't do anything specific to the index within
//this `if (view == nil) ...` statement because the view will be
//recycled and used with other index values later
view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 200.0f)];
((UIImageView *)view).image = [UIImage imageNamed:@"page.png"];
view.contentMode = UIViewContentModeCenter;
//back view i have just added this apart from it there is no change made by me in this method
UIView *backView = [[UIView alloc] initWithFrame:view.bounds];
backView.tag = 2;
[backView setBackgroundColor:[UIColor redColor]];
[view addSubview:backView];
[backView setHidden:YES];
//back view
label = [[UILabel alloc] initWithFrame:view.bounds];
label.backgroundColor = [UIColor clearColor];
label.textAlignment = NSTextAlignmentCenter;
label.font = [label.font fontWithSize:50];
label.tag = 1;
[view addSubview:label];
else
//get a reference to the label in the recycled view
label = (UILabel *)[view viewWithTag:1];
//set item label
//remember to always set any properties of your carousel item
//views outside of the `if (view == nil) ...` check otherwise
//you'll get weird issues with carousel item content appearing
//in the wrong place in the carousel
label.text = [_items[index] stringValue];
return view;
并实现 didSelect 委托如下:
- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index
UIView *frontview = [carousel itemViewAtIndex:index];
UIView *backView = [frontview viewWithTag:2];
BOOL isInFront = NO;
if (backView.hidden == NO)
isInFront = YES;
[UIView transitionWithView: isInFront ? backView : frontview
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^
[backView setHidden:isInFront];
completion:nil];
您应该编写更有条理的代码,这是一个示例,向您展示您可以通过 iCarausal 实现您想要的。
【讨论】:
以上是关于如何在点击/选择时替换 iCarousel 中的特定视图?的主要内容,如果未能解决你的问题,请参考以下文章