UIScrollView动态内容未显示

时间:2014-01-15 10:03:32

标签: ios objective-c uiscrollview

我在将UIButtons与背景图像动态添加为UIScrollView的子视图时遇到了麻烦。它是一种在scrollView上使用UIButtons的图库。我已经将这种方法用于我的几个应用程序,它对我来说非常适合静态内容。 但这一次,我从Web服务加载图像并保存到文档目录,然后调用该方法创建库。逻辑与我的其他应用程序相同。但我无法弄清楚这里的问题是什么。 我将把这两个代码用于检索数据,其他代码用于创建库。

从服务器检索数据

-(void)loadDataFromServer{

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

arrCats = [[NSMutableArray alloc]init];
arrPromos = [[NSMutableArray alloc]init];

//[spinMenu startAnimating];

// load promo images from the server
for(int i=0;i<[arrPromos count];i++)
{
    NSString *urlString = [Constants getImages:[[arrPromos objectAtIndex:i] objectForKey:@"image"]];
    NSLog(@"Get Images API Call : %@", urlString);

    NSURL *imageurl = [NSURL URLWithString:urlString];

    //get a dispatch queue
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //this will start the image loading in bg
    dispatch_async(concurrentQueue, ^{
        NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageurl];

        //this will set the image when loading is finished
        dispatch_async(dispatch_get_main_queue(), ^{
            if(imageData != nil){

                // save the images temporally
                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
                NSString *filePath = [documentsPath stringByAppendingPathComponent:[[arrPromos objectAtIndex:i] objectForKey:@"image"]]; //Add the file name
                [imageData writeToFile:filePath atomically:YES];
            }

        });
    });
}


// Load promotions from server
dispatch_async(queue, ^{
    NSLog(@"Promotions Loading Started");

    NSString *urlString = [Constants getAllPromotions:@"GetPromo.php"];
    NSLog(@"Get Promotions API Call : %@", urlString);

    NSURL *url = [NSURL URLWithString:urlString];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // Specify that it will be a GET request
    request.HTTPMethod = @"GET";
    [request setHTTPShouldHandleCookies:NO];

    NSURLResponse *responseURL;
    NSError *error;
    NSData *dataPromotions = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseURL error:&error];

    if (responseURL == nil)
    {
        // Check for problems
        if (error != nil)
        {
            NSLog(@"Get Promtions Connection failed! Error - %@", [error localizedDescription]);

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection Error!" message:@"Promotions data failed to load!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                            [alert show];

        }
    }
    else
    {
        NSString *responseString = nil;
        responseString = [[NSString alloc] initWithData:dataPromotions encoding:NSUTF8StringEncoding];

        if ([responseString rangeOfString:@"error"].location == NSNotFound)
        {
            NSDictionary *response = [[NSDictionary alloc] init];
            response = (NSDictionary *)[responseString JSONValue];

            NSLog(@"Response : Promotions %@", response);

            if(response != Nil){

                if([response count]>0){
                    arrPromos = [NSMutableArray arrayWithArray:[response objectForKey:@"Promos"]];

                    NSLog(@"ArrPromos @ loading %@", arrPromos);
                    // create promos galley
                    [self createPromosGallery];

                }
            }
        }
    }

});

注意:[self createPromosGallery];在下载所有图像和数据后调用。

创建图库

-(void) createPromosGallery{

// sort arrPromos based on priority
for(int i=0; i<[arrPromos count];i++){
    [arrPromos sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSDictionary *dict1 = obj1;
        NSDictionary *dict2 = obj2;

        NSString *string1;
        NSString *string2;

        if(![[dict1 objectForKey:@"priority"] isKindOfClass: [NSNull class]])
            string1 = [dict1 objectForKey:@"priority"];

        if(![[dict2 objectForKey:@"priority"] isKindOfClass: [NSNull class]])
            string2 = [dict2 objectForKey:@"priority"];

        return [string1 compare:string2 options:NSNumericSearch];
    }];
}

NSLog(@"ArrPromos %@", arrPromos);

// scrollView size
CGFloat screenHieght = [UIScreen mainScreen].bounds.size.height;

if(screenHieght>500){
    scrollView.frame = CGRectMake(0, 0, 320, 568);
}
else{
    scrollView.frame = CGRectMake(0, 0, 320, 480);
}

// define scrollview height
int scrollHieght;

scrollHieght = ([arrPromos count]-1)/2;

NSLog(@"Scroll height %d",scrollHieght);

scrollView.contentSize = CGSizeMake(scrollView.frame.size.width , scrollHieght * 160 +200);

scrollView.pagingEnabled = NO;

scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
scrollView.delegate = self;


for(int i=0;i<[arrPromos count];i++)
{

    float x;
    float y;


    if(i%2==0)
    {
        x=30.0;
        y=(i/2)*160+25;

    }

    if(i%2==1) {

        x=170.0;
        y=(i/2)*160+25;


    }

    // retreive saved images
    NSString *strImgName;
    UIImage *buttonUpImage;

    // create buttons
    button = [UIButton buttonWithType:UIButtonTypeCustom];

    strImgName = [[arrPromos objectAtIndex:i] objectForKey:@"image"];

    NSLog(@"Button image name %@", strImgName);

    NSArray *sysPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
    NSString *docDirectory = [sysPaths objectAtIndex:0];
    NSString *filePath = [NSString stringWithFormat:@"%@/%@",docDirectory,strImgName];
    buttonUpImage  = [UIImage imageWithContentsOfFile:filePath];
    [button setBackgroundImage:buttonUpImage forState:UIControlStateNormal];

    button.frame = CGRectMake(x, y, 120,140);
    [button setTag:i];
    [button addTarget:self action:@selector(promoBtnPressed:)forControlEvents:UIControlEventTouchUpInside];
    [self.scrollView addSubview:button];


}

}

注意:我在iOS 7和6上都进行了测试。在iOS 7中,在scrollView上显示图像需要很长时间(目前只有2张图像)。或者,如果我在scroolView上进行TAP,则会出现图像。

在ios 6中,没有任何内容出现

2 个答案:

答案 0 :(得分:0)

是的,因为您正在下载然后保存需要时间的图像。我建议您使用任何库来下载图像并保存它们。

Ex:SDWebImage

答案 1 :(得分:0)

//Make a method that has url (fileName) Param 
NSArray *documentsDirectory =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);

NSString *textPath = [documentsDirectory stringByAppendingPathComponent:url];

NSFileManager *fileManager =[NSFileManager defaultManager];

if ([fileManager fileExistsAtPath:textPath])
 {
return YES;
}
  else
{
return NO;
 }

 UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage
 imageNamed:@""]];//Placeholder image


if ([url isKindOfClass:[NSString class]])
{
imgView.image = [UIImage imageNamed:[url absoluteString]];
imgView.contentMode = UIViewContentModeScaleAspectFit;
}
else if ([fileManager fileExistsAtPath:url])
{


NSString *textPath = [documentsDirectory stringByAppendingPathComponent:url];

NSError *error = nil;

NSData *fileData = [NSData dataWithContentsOfFile:textPath options:NSDataReadingMappedIfSafe error:&error];

if (error != nil)
{
    DLog(@"There was an error: %@", [error description]);
    imgView.image=nil;
}
else
{
    imgView.image= [UIImage imageWithData:fileData]
}
}
else
 {   UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]
 initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];


CGPoint center = imgView.center;
//            center.x = imgView.bounds.size.width / 2;

spinner.center = center;
[spinner startAnimating];

[imgView addSubview:spinner];


dispatch_queue_t downloadQueue = dispatch_queue_create("iamge downloader", NULL);

dispatch_async(downloadQueue, ^{

    NSData *imgData = [NSData dataWithContentsOfURL:url];

    dispatch_async(dispatch_get_main_queue(), ^{


        [spinner removeFromSuperview];

        UIImage *image = [UIImage imageWithData:imgData];


         NSError *error = nil;

         [imgData writeToFile:url options:NSDataWritingFileProtectionNone error:&error];

          if (error != nil)


          }
          else
          {

          }

        imgView.image = image;
    });
});
}

这是ImageView加载图像,如果它在文档中不存在那么它保存它,一个活动指示符被添加到显示图像加载保存,