平滑滚动imageview

时间:2013-06-27 06:53:45

标签: ios objective-c uiscrollview

我已将图像动态添加到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时,它没有顺利显示图像。它在滚动过程中卡住了。

这些是预览,显示第二张图像开头的当前图像。

8 个答案:

答案 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就是这样的很好的方式去做它很快。 你可以阅读

  1. 延迟加载

    2.paging enabled。

  2. 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内容模式设置为非调整大小的模式。在已经实现了其他方法(异步缓存和其他方法)之后,它给了我显着的滚动改进。