我想创建一个iphone应用程序,该应用程序显示三行无限数量的图像,这些图像应该来自AWS S3,并且当用户在每行向右滚动时动态加载。 我想做的是将顶行小,中间行大和底行小。用于内存管理的缓存和智能延迟加载至关重要。
我看了Three20,但对于这么简单的任务来说太复杂了。任何简单库的想法,甚至更好的原生方法。
答案 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];
}