如何在点击/选择时替换 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 中的特定视图?的主要内容,如果未能解决你的问题,请参考以下文章

从 segued View 返回时如何重新加载 iCarousel?

iOS:iCarousel 中未选择视图的约束

如何删除 iCarousel 中的重复项

如何仅选择 iCarousel 的中心图像?

如何在 iCarousel 视图中单击缩放图像?

如何将图像从相机/UIImagePickerController 动态添加到 iPhone 中的 iCarousel