Ios 如何在iPhone的UIScrollView中动态添加图像

Ios 如何在iPhone的UIScrollView中动态添加图像,ios,sdk,uiscrollview,uiimage,Ios,Sdk,Uiscrollview,Uiimage,在我的iPhone应用程序中,我从web服务器上获得了大约300个图像url,我需要在UIScrollView上以3x3行和列格式显示所有图像。从web服务器获取所有url后,将其转换为UIImage并显示图像。一切正常,但是在加载了200张图片后,应用程序崩溃了,我读到很多关于UIScrollView的内存问题,所以我们如何处理这个问题呢。我也读过苹果的文档,但不清楚。我不明白为什么你所做的是一个问题。可能是你的记忆有问题。在这种情况下,模拟器和设备的结果应该不同 如果这是内存问题,则应使用t

在我的iPhone应用程序中,我从web服务器上获得了大约300个图像url,我需要在UIScrollView上以3x3行和列格式显示所有图像。从web服务器获取所有url后,将其转换为UIImage并显示图像。一切正常,但是在加载了200张图片后,应用程序崩溃了,我读到很多关于UIScrollView的内存问题,所以我们如何处理这个问题呢。我也读过苹果的文档,但不清楚。

我不明白为什么你所做的是一个问题。可能是你的记忆有问题。在这种情况下,模拟器和设备的结果应该不同

如果这是内存问题,则应使用tableview而不是滚动视图。在每个表视图单元格中放置3个图像,这样就可以了


Cdt

我得到的印象是,您正在同时下载所有300个图像,并将其保存在内存中,并添加到UIScrollView中

有一种技术叫做LazyLoad,意思是不要一次加载所有的图像,而是在队列中加载

你可以参考这个链接,它可能会帮助你顺利完成任务


祝你一切顺利

如果要以Gridview格式显示图像,则可以使用。对于图像的延迟加载,您可以使用。

您是否正在释放不再可见的元素?UITableView就是这样做的(这就是为什么Sandro建议这样做)。 UIScrollView的实现应该做到这一点


您也可以考虑或考虑网格实现。

< p>这里是解决方案,我在应用程序中实现了。这是我的密码 sv_端口是我的滚动视图。 下载SDWebImageDownloader类文件并将其导入到项目中。在项目中添加相关框架。像imageIO.framework、QuartzCore

现在,在你的.m中添加

#import "UIImageView+WebCache.h"
#import "SDImageCache.h"
#import "SDWebImageCompat.h"

//function for adding image in your scrollview
-(void)populateImages
{
int x=6,y=6;

for(UIView * view in sv_port.subviews){
    if([view isKindOfClass:[UIImageView class]])
    {
        [view removeFromSuperview]; view = nil;
    }
    if([view isKindOfClass:[UIButton class]])
    {
        [view removeFromSuperview]; view = nil;
    }
}

for(int p=0;p<[Manufacturer count];p++)
{
    UIButton *btnImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
    btnImageButton.frame = CGRectMake(x,y,70,70);
    [btnImageButton setTag:p];
    [btnImageButton addTarget:self action:@selector(nextview:) forControlEvents:UIControlEventTouchUpInside];

    UIActivityIndicatorView *spinny = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinny.frame=CGRectMake(btnImageButton.frame.origin.x+25,btnImageButton.frame.origin.y+25, 20, 20);
    spinny.backgroundColor=[UIColor clearColor];
    [spinny startAnimating];

    [sv_port setScrollEnabled:YES];
    [sv_port addSubview:spinny];

    UIImageView *asyncImageView = [[[UIImageView alloc] initWithFrame:btnImageButton.frame] autorelease];
    asyncImageView.backgroundColor=[UIColor clearColor];
    CALayer *layer;
    layer = asyncImageView.layer;
    layer.borderWidth = 0.5;
    layer.cornerRadius = 5;
    layer.masksToBounds = YES;


     [asyncImageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", yourUrl] ]   placeholderImage:[UIImage imageNamed:nil] options:0 andResize:CGSizeMake(btnImageButton.frame.size.width,btnImageButton.frame.size.height) withContentMode:UIViewContentModeScaleAspectFit];
    asyncImageView.contentMode = UIViewContentModeScaleAspectFit;

    [sv_port addSubview:btnImageButton];
    [sv_port addSubview:asyncImageView];
    int imgCntPort=0;

    imgCntPort=(sv_port.frame.size.width/(asyncImageView.frame.size.width));

    ////NSLog(@"imgport %d",imgCntPort);
    if((p+1)%imgCntPort==0)
    {
        x=5;
        y=y+80;
    }
    else
    {
        x=x+80;
    }
}
sv_port.contentSize = CGSizeMake(0, y);
glob_x =0; glob_y =y;
}
#导入“UIImageView+WebCache.h”
#导入“SDImageCache.h”
#导入“SDWebImageCompat.h”
//用于在滚动视图中添加图像的函数
-(无效)大众形象
{
int x=6,y=6;
用于(sv_port.子视图中的UIView*视图){
if([view IsKindof类:[UIImageView类]])
{
[view removeFromSuperview];view=nil;
}
if([view IsKindof类:[UIButton类]])
{
[view removeFromSuperview];view=nil;
}
}
对于(int p=0;p
-(void)滚动图像
{
[AsyncImageLoader sharedLoader].cache=nil;
NSArray*viewsToRemove=[\u滚动视图\u gallary子视图];
用于(viewsToRemove中的UIView*v){
[v从SuperView移除];
}
CGFloat width=\u scrollview\u gallary.bounds.size.width;
_scrollview\u gallary.contentSize=CGSizeMake(宽度*[tmpArr计数]-1360);
[\u scrollview\u gallary setShowsHorizontalScrollIndicator:否];
[\u scrollview\u gallary设置显示垂直滚动指示器:否];
int x=0;
int y=0;

对于(int i=0;iYes),我正在读取图像并在UIScrollView中动态显示它们,增加UIScrollView的contentsize,一旦内存不足就会崩溃。可能的制造商副本是URL数组。
-(void)scrollimage
{
    [AsyncImageLoader sharedLoader].cache = nil;
    NSArray *viewsToRemove = [_scrollview_gallary subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }

    CGFloat width =_scrollview_gallary.bounds.size.width;

    _scrollview_gallary.contentSize=CGSizeMake(width*[tmpArr count]-1, 360);
    [_scrollview_gallary setShowsHorizontalScrollIndicator:NO];
    [_scrollview_gallary setShowsVerticalScrollIndicator:NO];
    int x=0;
    int y=0;
    for (int i=0; i<[tmpArr count]; i++)
    {
        AsyncImageView *imgv;
        imgv =[[AsyncImageView alloc] initWithFrame:CGRectMake(x,y,width,360)];
        imgv.contentMode = UIViewContentModeScaleToFill;
        imgv.activityIndicatorStyle = UIActivityIndicatorViewStyleWhite;
        NSString *strimag=[NSString stringWithFormat:@"%@",[tmpArr objectAtIndex:i]];
        imgv.imageURL=[NSURL URLWithString:[tmpArr objectAtIndex:i]];
        [_scrollview_gallary addSubview:imgv];
        x=x+width;
    }
    _pageview.numberOfPages=([tmpArr count]);
    _scrollview_gallary.pagingEnabled = YES;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    int page;
    CGFloat pageWidth = _scrollview_gallary.frame.size.width;
    page = floor((_scrollview_gallary.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    self.pageview.currentPage = page;

}