2013-08-06 2 views
0

Я загружаю набор изображений и отображаю их бок о бок в горизонтально прокручиваемом UiScrollView.Как выложить изображения рядом друг с другом в UIScrollView?

На Android у меня есть LinearLayout в ScrollView с подходящим набором силы тяжести. Когда изображения загружаются, они добавляются в макет и отображаются соответствующим образом - в правильных пропорциях, растягивая родительский вид для их размещения.

На iOS У меня сложнее время. Я использую AsyncImageView для загрузки изображений, и это отлично работает. Проблема в том, что я должен инициализировать каждую точку зрения своими границами, прежде чем я узнаю, какими они будут.

for(NSString* url in self.imageURLs){ 
    AsyncImageView *iView = [[AsyncImageView alloc] initWithFrame:self.imageScroller.frame]; 
    [iView showActivityIndicator]; 
    [iView setImageURL:[NSURL URLWithString:url]]; 
    [self.imageScroller addSubview:iView]; 
} 

Это не работает - все изображения загружаются поверх друг друга, и вытянуты пропорции к размеру кадра.

Есть ли простой способ иметь «гравитацию» или «плавать» как макет в iOS? Если нет, как я должен раскладывать свои изображения?

EDIT

Просто чтобы быть ясно: эти изображения имеют различные соотношения сторон, так что я не могу знать их размеры, пока они не загружены.

Вот мой Android макет

enter image description here

+0

Вы можете ... установить кадры вручную для каждого изображения, использование автоматический макет, используйте представление таблицы, используйте представление коллекции, используйте UIPageViewController, другое. – Fogmeister

+0

Не могли бы вы объяснить один из них? Начиная с Android, документация iOS может быть полностью непроницаемой. – fredley

+0

Если вы можете жить с поддержкой iOS 6+, вы должны действительно проверить ['UICollectionView'] (http://developer.apple.ком/библиотека/ИОС/# документация/UIKit/Справка/UICollectionView_class/Справка/reference.html). Это компонент «UI», который может делать именно то, что вы хотите. – rckoenes

ответ

1

Вы должны установить положение (кадр) каждого IVIEW вручную. Например, для вертикального размещения:

CGFloat y = 0; 
for(NSString* url in self.imageURLs){ 
    CGRect frame = self.imageScroller.bounds; 
    frame.origin.y = y; 
    y = y + frame.size.height; 
    AsyncImageView *iView = [[AsyncImageView alloc] initWithFrame:frame]; 
    [iView showActivityIndicator]; 
    [iView setImageURL:[NSURL URLWithString:url]]; 
    [self.imageScroller addSubview:iView]; 
} 

Также на и это вы должны увеличить размер контента imageScroller в состоянии выделить:

self.imageScroller.contentSize = CGSizeMake(y, self.imageScroller.frame.width); 
0

Попробуйте это:

CGRect currentFrame = self.imageScroller.bounds; 
for(NSString* url in self.imageURLs){ 
    AsyncImageView *iView = [[AsyncImageView alloc] initWithFrame:currentFrame]; 
    [iView showActivityIndicator]; 
    [iView setImageURL:[NSURL URLWithString:url]]; 
    [self.imageScroller addSubview:iView]; 
    currentFrame.origin.x += current.frame.size.width; // that is if you put them next to each other horizontally, otherwise use origin.y and size.height 
} 

Также не забудьте установить contentSize imageScroller, если вы еще этого не сделали.

0

ОК, поэтому самый простой способ сделать это - просто вычислить и установить кадр для каждого изображения.

int i = 0; 

float width = self.imageScroller.frame.size.width; 
float height = self.imageScroller.frame.size.height; 
float y = 0; 

for(NSString* url in self.imageURLs){ 
    ++i; 

    float x = i * width; 

    AsyncImageView *iView = [[AsyncImageView alloc] initWithFrame:CGRectMake(x, y, width, height)]; 
    [iView showActivityIndicator]; 
    [iView setImageURL:[NSURL URLWithString:url]]; 
    [self.imageScroller addSubview:iView]; 
} 

Однако у вас возникнут проблемы при загрузке большого количества изображений.

Лучший способ сделать это - использовать UIPageViewController. Смотрите где-нибудь здесь ... http://www.raywenderlich.com/forums/viewtopic.php?f=5&t=3120

0

В конце концов, это было проще сделать правильно, добавив данные в полезную нагрузку АЯКС:

CGRect currentFrame = self.imageScroller.bounds; 
CGFloat currentX = self.imageScroller.bounds.origin.x; 
for(NSDictionary* snap in self.imageURLs){ 
    NSNumber *iWidth = [snap objectForKey:@"width"]; 
    NSNumber *iHeight = [snap objectForKey:@"height"]; 
    CGFloat width = [iWidth floatValue] * currentFrame.size.height/[iHeight floatValue]; 
    CGRect bounds = CGRectMake(currentX, currentFrame.origin.y, width, currentFrame.size.height); 
    AsyncImageView *iView = [[AsyncImageView alloc] initWithFrame:bounds]; 
    [iView showActivityIndicator]; 
    [iView setImageURL:[NSURL URLWithString:[snap objectForKey:@"url"]]]; 
    [self.imageScroller addSubview:iView]; 
    currentX += width; 
} 
self.imageScroller.contentSize = CGSizeMake(currentX,currentFrame.origin.y); 
Смежные вопросы