iCarousel不能顺利滚动

我正在使用iCarousel滚动标签。 一切工作正常在模拟器上,但在iPad / iPhone的滚动不顺畅,快捷

这里是代码。

CitiesListView.h

#import <UIKit/UIKit.h> #import "iCarousel.h" @interface CitiesListView : UIView <iCarouselDataSource, iCarouselDelegate> @property (nonatomic, retain) iCarousel *carousel; @end 

CitiesListView.m

 #import "CitiesListView.h" @interface CitiesListView () @property (nonatomic, retain) NSMutableArray *items; @end @implementation CitiesListView @synthesize carousel; @synthesize items; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setUp]; } return self; } - (void)setUp { carousel = [[iCarousel alloc]initWithFrame:CGRectMake(0, 0, 300, 200)]; items = [NSMutableArray arrayWithObjects:@"city1", @"city2", @"city3", @"city4", @"city5", @"city6", nil]; [self addSubview:carousel]; carousel.delegate = self; carousel.dataSource = self; carousel.type = iCarouselTypeRotary; } - (id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { [self setUp]; } return self; } #pragma mark iCarousel methods - (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel { return [items count]; } - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view { UILabel *label = nil; //create new view if no view is available for recycling if (view == nil) { view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 200.0f)]; ((UIImageView *)view).image = [UIImage imageNamed:@"labelBackground.png"]; view.contentMode = UIViewContentModeCenter; label = [[UILabel alloc] initWithFrame:view.bounds]; label.backgroundColor = [UIColor clearColor]; label.textAlignment = UITextAlignmentCenter; label.font = [label.font fontWithSize:26]; 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 objectAtIndex:index]; return view; } - (NSUInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel { //note: placeholder views are only displayed on some carousels if wrapping is disabled return 2; } - (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)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:@"labelBackground.png"]; view.contentMode = UIViewContentModeCenter; label = [[UILabel alloc] initWithFrame:view.bounds]; label.backgroundColor = [UIColor clearColor]; label.textAlignment = UITextAlignmentCenter; label.font = [label.font fontWithSize:50.0f]; 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 = (index == 0)? @"[": @"]"; return view; } - (CATransform3D)carousel:(iCarousel *)_carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform { //implement 'flip3D' style carousel transform = CATransform3DRotate(transform, M_PI / 8.0f, 0.0f, 1.0f, 0.0f); return CATransform3DTranslate(transform, 0.0f, 0.0f, offset * carousel.itemWidth); } - (CGFloat)carousel:(iCarousel *)_carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value { //customize carousel display switch (option) { case iCarouselOptionSpacing: { //add a bit of spacing between the item views return value * 1.05f; } case iCarouselOptionFadeMax: { if (carousel.type == iCarouselTypeCustom) { //set opacity based on distance from camera return 0.0f; } return value; } default: { return value; } } } #pragma mark iCarousel taps - (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index { NSNumber *item = [self.items objectAtIndex:index]; NSLog(@"Tapped view number: %@", item); } @end 

并在我的视图控制器alloc / initWithFrame CitiesListView并添加到self.view。

我做错了什么。 我需要标签滚动光滑像例子。

谢谢。

在你的setUp方法中,调用这个:

 carousel.centerItemWhenSelected = YES; 

同时玩carousel.scrollSpeed (值:0.0到1.0,默认1.0,这意味着最快)来改变滚动速度。

使用任何一种方法

  • (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index reusingView:(UIView *)view

(要么)

  • (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view

这个问题从根本上说就是你试图将太多的图像一次加载到内存中(视图数量x每个视图的animation帧数)。

您需要find一种dynamic加载帧的方法。 尝试使用我的GLView库( https://github.com/nicklockwood/GLView ),其中包含使用可以实时加载的PVR图像播放animation的说明。 GLView库包含一个像UIImageView一样工作的GLImageView类,让我们指定一组图像文件名来播放,而不必事先加载所有的图像。

这可能有助于某人。我有类似的问题,其中iCarousel没有滚动平滑。 原来我正在做一些沉重的validation(图像比较)的方法名为- (void)carouselCurrentItemIndexDidChange:(iCarousel *)carousel

一旦我保持相关的validation是轻量级的,问题已经解决。