我已将图像动态添加到scrollview。以下是代码:
-(void)displayimages {
for (int i=0; i<[featuredarray count]; i++) {
NSString *image=[[featuredarray objectAtIndex:i]objectForKey:@"img"];
if (i==0) {
webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*290+15, 0, 270, 380)];
}
else {
webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*290+15, 0, 270, 380)];
}
webview.backgroundColor=[UIColor clearColor];
webview.layer.borderWidth=4;
webview.layer.cornerRadius=4;
webview.layer.borderColor=[[UIColor whiteColor]CGColor];
[webview setTag:i];
webview.userInteractionEnabled=YES;
NSURL *url = [NSURL URLWithString:image];
[webview setImageWithURL:url placeholderImage:[UIImage
imageNamed:@"placeholder.png"]];
[scroll addSubview:webview];
UITapGestureRecognizer *tap1 =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handlefirstTap:)];
tap1.delegate=self;
tap1.numberOfTapsRequired=1;
[webview addGestureRecognizer:tap1];
[tap1 release];
[webview release];
}
pages.defersCurrentPageDisplay=YES;
scroll.delegate =self;
scroll.contentSize = CGSizeMake(290*[featuredarray count],300);
scroll.pagingEnabled = YES;
pages.numberOfPages = [featuredarray count]-1;
pages.currentPage =0;
}
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
CGRect frame = scroll.frame;
frame.origin.x = frame.size.width-15*gallerypage;
NSLog(@"frame.origin.x..%f",frame.origin.x);
frame.origin.y =0;
[scroll scrollRectToVisible:frame animated:YES];
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
CGRect frame = scroll.frame;
frame.origin.x=gallerypage*290;
frame.origin.y =0;
[scroll scrollRectToVisible:frame animated:YES];
}
当我使用pagecontroller动作
时,它正好显示图像-(IBAction)pagecontrolaction:(id)sender {
int page = pages.currentPage;
CGRect frame = scroll.frame;
frame.origin.x=page*290;
frame.origin.y =0;
[scroll scrollRectToVisible:frame animated:YES];
}
但是当我使用触摸事件进行imageview时,它没有顺利显示图像。它在滚动过程中卡住了。
这些是预览,显示第二张图像开头的当前图像。
答案 0 :(得分:1)
这两个方法:scrollViewWillBeginDecelerating和scrollViewDidEndDecelerating包含两个不同x位置的动画,它被动画化为:
frame.origin.x = frame.size.width-15*gallerypage;
和
frame.origin.x=gallerypage*290;
最好是关闭以下任一功能:scrollViewWillBeginDecelerating或scrollViewDidEndDecelerating。否则你可能应该调整x位置(两个函数必须同步),它将被动画化为。
答案 1 :(得分:0)
if (i==0) {
webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*320, 0, 270, 440)];
}
else {
webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*320, 0, 270, 380)];
}
答案 2 :(得分:0)
您需要更改从远程资源加载图像的实现,这是最大的瓶颈所在。
我不想详细介绍,但尝试更换这行代码
[webview setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
有更多友好的c.p.u。使用采用多线程的缓存机制,您要做的是将繁重的工作(下载远程图像)移动到另一个线程。
SDWebImage在这个https://github.com/rs/SDWebImage做得很好 如果您有点硬核,可以使用
滚动自己的多线程图像下载器[NSURLConnection sendAsynchronousRequest:queue: completionHandler:]
在块中加载图像,甚至更好dispatch_async(queu, block)
答案 3 :(得分:0)
你应该结账SYPaginator(SYPaginator是一个水平的TableView,有延迟加载和查看回收。)
简单的分页滚动视图,使复杂的任务更容易。我们用 这在几个合成应用程序中包括Hipstamatic,D系列, 和IncrediBooth。
如果您需要更多性能,请尝试MSCachedAsyncViewDrawing:
Helper类,允许您同步绘制视图(a) UIImage带缓存以获得出色的性能。
答案 4 :(得分:0)
我认为发生这种情况是因为您的图片尺寸较大(MB),并且您可以将它们放入CGRect
而不调整特定尺寸的大小,同样重要的是您在滚动视图中加载了多少张图片,如果加载很多图片会占用大量内存,而且会慢慢滑动。
答案 5 :(得分:0)
当你试图显示更大尺寸的图像时会发生这种情况,你必须使用缓存来获取图像并尝试从那里加载图像。为了更好地知道如何使用它。使用SDwebimage就是这样的很好的方式去做它很快。 你可以阅读
延迟加载
2.paging enabled。
https://github.com/rs/SDWebImage
需要任何进一步的帮助。快乐帮助你。
答案 6 :(得分:0)
我不确定你开始滚动时为什么要设置框架,但如果我在你的位置,我会按照下面的说法进行操作:
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
// do nothing
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
CGFloat xoffset = 290 * gallerypage;
[UIView animateWithDuration:0.5
animations:^{
scrollView.contentOffset = CGPointMake(xoffset, 0);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
}
希望它有所帮助。
答案 7 :(得分:0)
在将图像加载到UIImageView之前,您绝对应该在后台调整图像大小。您还应该将UIImageView内容模式设置为非调整大小的模式。在已经实现了其他方法(异步缓存和其他方法)之后,它给了我显着的滚动改进。