脉冲就像无限滚动从Amazon Web Services S3加载的图像

时间:2011-07-19 06:32:38

标签: iphone ios uiscrollview uiimage amazon-web-services

我想创建一个iphone应用程序,该应用程序显示三行无限数量的图像,这些图像应该来自AWS S3,并且当用户在每行向右滚动时动态加载。 我想做的是将顶行小,中间行大和底行小。用于内存管理的缓存和智能延迟加载至关重要。

我看了Three20,但对于这么简单的任务来说太复杂了。任何简单库的想法,甚至更好的原生方法。

3 个答案:

答案 0 :(得分:4)

你应该仔细看看UIScrollView。 Apple已针对滚动内容的特定意图创建了此类。 Apple提供了不少样本,他们在最近的WWDC上讨论了内容重用和高质量滚动的特定问题。

此基本策略是显示内容,并将滚动位置循环到更新线程将设置为动画的同一帧中。这导致在完美时刻移动内容以欺骗用户相信内容是无限的。

修改: WWDC 2010:会议104 - 使用滚动视图设计应用程序

<> WWDC 2011:Session 104 - 高级滚动浏览技术;第115节 - 滚动,滑动,拖动

虽然这个概念很容易理解,但看看Apple如何完成这项任务,并结合他们的最佳实践,将为您提供最佳代码。

答案 1 :(得分:2)


嗨Gil Margolin,

对于管理无限水平滚动tableView是一个很好的选择,而不是Scroll视图,您可以轻松地管理其上的延迟加载概念。

有很多关于这个技巧的教程。在那个技巧主要概念中, 我们必须将table作为主表的Cell的子视图并进行转换。

请参阅以下链接,

1)This one is good for clear trick of horizontal tableView Cell.

2)This one also good but little bit complicated.

之后,您可以在每个单元格tableView中管理延迟加载概念,并获得您想要的结果。

最好的运气。

答案 2 :(得分:1)

这是从S3中提取成像器的本机代码。第一个是自定义S3委托的h的实现。第二个是从S3获取对象的m文件。最后的方法应该在你想要显示图片的表的类中。

@protocol S3ObjectControllerDelegate

-(void)S3ControllerFinished:(NSString *)objectKey;

@end

@interface S3ObjectController :NSObject <AmazonServiceRequestDelegate>{
    NSMutableData *responseData;
    NSString *keyName;

    AmazonS3Client *s3Client;
    S3GetObjectRequest *s3GOR;

    id <S3ObjectControllerDelegate> delegate;

}

-(void)s3GetRacerPictuers;

@property (nonatomic, strong) NSString *keyName;
@property (nonatomic, strong) UIImage *image;

@property (nonatomic, strong) id  <S3ObjectControllerDelegate> delegate; //was assign


@end

@implementation S3ObjectController
@synthesize keyName,image;
@synthesize delegate;


-(void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error
{
    NSLog(@"Error %@",error);
}

-(void)request:(AmazonServiceRequest *)request didReceiveResponse:(NSURLResponse *)response 
{
    //NSLog(@"Response Key %@", response);
    responseData = [[NSMutableData  alloc]init];
}

-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data
{
    //NSLog(@"ObjectRequestKey = %@",request);
    [responseData appendData:data];
}

-(void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response
{
    UIImage *myImage = [[UIImage alloc]initWithData:responseData];


    if(myImage == nil) 
    {
        //NSLog(@"NO IMAGE");

        image = [UIImage imageNamed:@"placeholder.png"];
        responseData = nil;
    }
    else
    {
        //NSLog(@"image added");

        image = myImage;
        responseData = nil;
    }
    [[self delegate] S3ControllerFinished:keyName];
}

-(void)s3GetPictuers
{
   // NSLog(@"Method Called");

    s3Client = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY];
    s3GOR = [[S3GetObjectRequest alloc]initWithKey:keyName withBucket:[Constants pictureBucket]];
    s3GOR.delegate = self;
    [s3Client getObject:s3GOR];

    //NSLog(@"Method Finished");
}

@end

-(void)S3ControllerFinished:(NSString *)objectKey
{
    S3ObjectController *newS3 = [[S3ObjectController alloc] init];
    newS3 = [tempDictionary objectForKey:objectKey];
    UIImage *tempImage = newS3.image;
    [dictionaryOfImages setObject:tempImage forKey:objectKey];
    [table reloadData];

}