如何实现像iCarousel Rotary类型,Objective-C这样的UI?

时间:2017-05-24 13:17:49

标签: ios objective-c horizontal-scrolling icarousel

我想实现这种类型的UI(水平滚动)。

enter image description here

我知道它的那种“iCarousel”,Type = iCarouselTypeRotary。我试过这个库,但我得到这种类型的UI。我无法完全自定义:

enter image description here 如果有人知道如何以本地方式使用任何库来执行此UI,请告诉我。任何输入都将受到赞赏。

3 个答案:

答案 0 :(得分:2)

iCarousel库提供iCarouselTypeCustom类型。

以下是一个自定义示例。

if (firstLetters.equalsIgnoreCase(lastLetters)) //Ignores case and checks if the firstLetters and lastLetters are the same
{
    System.out.println("The fist two letters and the last two are the same!");//if they are than print out this
    break;
}

答案 1 :(得分:1)

最后我做了自定义视图,我已经实现了UI,因为我需要它。在这里,我为有需要的人提供我的代码。

- (void)viewDidLoad
{
    [super viewDidLoad];
    _iCarouselItems = [[NSMutableArray alloc]init];
    for (int i = 0; i < 10; i++)
    {
        [_iCarouselItems addObject:@(i)];
    }
    self.iCarouselView.dataSource = self;
    self.iCarouselView.delegate = self;
    _iCarouselView.type = iCarouselTypeCustom;
    dispatch_async(dispatch_get_main_queue(), ^{
        [_iCarouselView reloadData];
    });
}

#pragma mark iCarousel methods
- (NSInteger)numberOfItemsInCarousel:(iCarousel *)carousel
{
    return [_iCarouselItems count];
}

- (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)
    {
         NSLog(@"viewForItemAtIndex is %ld",(long)index);
        //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, 200.0f)];
//        ((UIImageView *)view).image = [UIImage imageNamed:@"smiley-400x400.jpg"];

        view.contentMode = UIViewContentModeCenter;
        view.backgroundColor = [UIColor whiteColor];
        view.layer.cornerRadius = 8;
        view.layer.masksToBounds = true;
        view.layer.borderColor = [UIColor grayColor].CGColor;
        view.layer.borderWidth = 2;

        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];
    }
    label.text = [_iCarouselItems[index] stringValue];
    return view;
}

- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
    CGFloat offsetFactor = [self carousel:carousel valueForOption:iCarouselOptionSpacing withDefault:0.3]*carousel.itemWidth;

    CGFloat zFactor = 400.0;
    CGFloat  normalFactor = 0;
    CGFloat  shrinkFactor = 100.0;
    CGFloat f =  sqrt(offset * offset + 1)-1;

    transform = CATransform3DTranslate(transform, offset * offsetFactor, f * normalFactor, f * (-zFactor));
    transform = CATransform3DScale(transform, 1 / (f / shrinkFactor + 1.0), 1 / (f / shrinkFactor + 1.0), 1.0 );

    return transform;
}

- (BOOL)carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index
{
    return true;
}

- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index
{
    NSLog(@"Selected carouselindex is %ld",(long)index);
}

- (NSInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel
{
    //note: placeholder views are only displayed on some carousels if wrapping is disabled
    return 0;
}

enter image description here

答案 2 :(得分:0)

有三种可用于3D旋转木马的解决方案。

例如,看看那个:https://www.cocoacontrols.com/controls/parallaxcarousel

您可以找到源代码on Github。此项目使用CABasicAnimation,您可以使用CocaPods安装它。