Загрузка UIImageView из URL в UIScrollView с UIActivityIndicatorView для каждого UIImageView - PullRequest
0 голосов
/ 03 августа 2011

У меня есть следующий код, который прекрасно работает UIScrollView. Но при загрузке изображения можно увидеть только при последнем подпредставлении, а UIActivityIndicatorView не работает для загрузки каждого изображения.

Как это сделать для такой задачи?

myProject2ViewController.h

#import <UIKit/UIKit.h>
#import "PageScrollView.h"

@interface myProject2ViewController : UIViewController
{
    NSMutableArray *pages;
    PageScrollView *scrollView;
    UIView *myOneSubview;
    UIImageView *imageView;
    UIActivityIndicatorView *myIndicator;
}

@property (nonatomic, retain) PageScrollView *scrollView;
@property (nonatomic, retain) UIImageView *imageView;
@property (nonatomic, retain) UIActivityIndicatorView *myIndicator;

@end

myProject2ViewController.m

#import "myProject2ViewController.h"

@implementation myProject2ViewController

@synthesize scrollView;
@synthesize imageView;
@synthesize myIndicator;

- (void)dealloc
{
    [super dealloc];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *imageUrls = [NSArray arrayWithObjects:
                          @"link_1",
                          @"link_2",
                          @"link_3",
                          nil];

    pages = [[NSMutableArray alloc] init];

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

        CGRect frameOne = CGRectMake(0.0f, 50.0f, 320.0f, 416.0f);
        myOneSubview = [[UIView alloc] initWithFrame:frameOne];
        myOneSubview.backgroundColor = [UIColor blackColor];

        NSString *imageUrl = [imageUrls objectAtIndex:i];

        myIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        myIndicator.center = CGPointMake(160.0f, 130.0f);
        myIndicator.hidesWhenStopped = YES;
        myIndicator.backgroundColor = [UIColor clearColor];

        imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 50.0f, 320.0f, 416.0f)];

        [NSThread detachNewThreadSelector:@selector(loadImages:) toTarget:self withObject:imageUrl];

        [myOneSubview addSubview:imageView];

        [pages addObject:myOneSubview];
    }

    scrollView = [[PageScrollView alloc] initWithFrame:self.view.frame];
    scrollView.pages = pages;
    scrollView.delegate = self;
    self.view = scrollView;
}

- (void)loadImages:(NSString *)string
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [myIndicator startAnimating];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;


    NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:string]];
    UIImage *image = [[UIImage alloc] initWithData:imageData];
    [imageView setImage:image];

    [image release];
    [imageData release];

    [self performSelectorOnMainThread:@selector(loadImageComplete) withObject:self waitUntilDone:YES];

    [pool drain];
}

-(void)loadImageComplete
{
    NSLog(@"Load image complete!");
    [myIndicator stopAnimating];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

@end

1 Ответ

0 голосов
/ 07 августа 2011

Когда вы делаете:

CGRectMake(0.0f, 50.0f, 320.0f, 416.0f);

Внутри цикла for вы указываете те же точную позицию и размер для КАЖДОГО изображения, которое вы создаете в цикле for. Другими словами, каждое следующее изображение, которое вы создаете, будет располагаться поверх предыдущего изображения, в результате вы увидите только конечное изображение, которое вы создали в цикле for.

Попробуйте добавить переменную счетчика "i" к значению X и Y в CGRectMake (), чтобы компенсировать каждое изображение, которое впоследствии создается.

Допустим, каждое изображение было размером 100 на 100 пикселей, а затем что-то вроде:

CGRectMake(0.0f + (i * 100.0f), 50.0f, 320.0f, 416.0f);

Устанавливает каждое изображение сразу после предыдущего (поскольку каждое изображение имеет ширину 100 пикселей, мы смещаем его на 100 пикселей и используем это значение в качестве начальной точки следующего изображения). Если вы добавите дополнительное значение после (i * 100), чтобы оно стало (i * 100 + 50), тогда это даст вам отступ в 50 пикселей по сравнению с предыдущим изображением.

Если ваши изображения имеют разные размеры, вам нужно предварительно рассчитать ширину и высоту изображения и включить их в ваш метод CGRectMake ().

Надеюсь, это поможет.

Кроме того, вместо создания стольких представлений, которые можно добавить к представлению с прокруткой, вы можете написать код следующим образом:

scrollView = [[UIScrollview alloc] init];

. . .

for(...)
{
    UIImageView *currentImage = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f + (i * 100.0f), 50.0f, 320.0f, 416.0f);
    [currentImage setImage:[UIImage imageNamed:[imageUrls objectAtIndex:i]]];

    . . .

    [scrollView addSubview: currentImage];
    [currentImage release];
}
...