0

我正在下载一组图像并以可水平滚动的方式并排显示它们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 中进行类似“重力”或“浮动”的布局?如果没有,我应该如何布置我的图像?

编辑

需要明确的是:这些图像具有不同的纵横比,因此在加载之前我无法知道它们的尺寸。

这是我的 Android 布局

在此处输入图像描述

4

4 回答 4

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);
于 2013-08-06T12:20:33.540 回答
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
}

如果您还没有设置 imageScroller 的 contentSize,请记住。

于 2013-08-06T12:23:13.100 回答
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

于 2013-08-06T12:23:19.637 回答
0

最后,通过将数据添加到 ajax 有效负载中,这是最简单的正确操作:

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);
于 2013-08-06T14:20:38.493 回答