автоматически выкладывать изображения в UIScrollView - PullRequest
2 голосов
/ 27 июня 2011

У меня есть список изображений, извлеченных из xml. Я хочу заполнить их просмотром uiscroll в таком порядке, чтобы он выглядел следующим образом.

1 2 3

4 5 6

7 8 9

10

если будет только 10 изображений, он просто остановится здесь.

сейчас мой текущий код такой

for (int i = 3; i<[appDelegate.ZensaiALLitems count]-1; i++) {
        UIButton *zenbutton2 =[UIButton buttonWithType:UIButtonTypeCustom];
        Items *ZensaiPLUitems = [appDelegate.ZensaiALLitems objectAtIndex:i];
        NSURL *ZensaiimageSmallURL = [NSURL URLWithString:ZensaiPLUitems.ZensaiimageSmallURL];
        NSLog(@"FVGFVEFV :%@", ZensaiPLUitems.ZensaiimageSmallURL);
        NSData *simageData = [NSData dataWithContentsOfURL:ZensaiimageSmallURL];
        UIImage *itemSmallimage = [UIImage imageWithData:simageData];
        [zenbutton2 setImage:itemSmallimage forState:UIControlStateNormal];
        zenbutton2.frame=CGRectMake( (i*110+i*110)-660 , 300, 200, 250);
        [zenbutton2 addTarget:self action:@selector(ShowNextZensaiPage) forControlEvents:UIControlEventTouchUpInside];
        [scrollView addSubview:zenbutton2];
}

обратите внимание на CGRectMake, мне нужно вручную назначать фиксированные значения для их позиционирования. Есть ли способ их заполнить, не назначая вручную. например, изображения будут автоматически перемещаться вниз, когда в первой строке будет 3 изображения, а затем для остальных.

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

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

Примерно так (где i - номер изображения, начиная с 0):

- (CGPoint)getImageOrigin:(NSInteger)imageNumber {

    CGFloat leftInset = 30;
    CGFloat xOffsetBetweenOrigins = 80;
    CGFloat topInset = 20;
    CGFloat yOffsetBetweenOrigins = 80;

    int numPerRow = 3;

    CGFloat x = leftInset + (xOffsetBetweenOrigins * (imageNumber % numPerRow));
    CGFloat y = topInset + (yOffsetBetweenOrigins * floorf(imageNumber / numPerRow));

    CGPoint imageOrigin = CGPointMake(x, y);

    return imageOrigin;

}

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

Чтобы вычислить значение x, я начинаю с минимального расстояния с левой стороны экрана (leftInset). Затем я добавляю расстояние от левой стороны одного изображения до следующего, умноженное на столбец (imageNumber % numPerRow).

Y рассчитывается аналогичным образом, но для вычисления строки я использую imageNumber / numPerRow, округленную в меньшую сторону.

Edit:

Вы попросили меня объяснить дальше, так что я посмотрю, что я могу сделать.

ОК, поэтому я хочу иметь возможность ввести номер изображения (начиная с 0) в мою функцию, и я хочу, чтобы источник (точка в верхнем левом углу) вернулся.

leftInset - это расстояние между левым краем вида и левым краем первого изображения.

xOffsetBetweenOrigins - расстояние от левого края одного изображения до левого края следующего изображения в той же строке. Поэтому, если я установлю его на 80, а мое изображение будет шириной 50 пикселей, между двумя изображениями в одной строке будет разрыв в 30 пикселей.

topInset похоже на левую вставку. Это расстояние от верхнего края изображения до верхнего края изображения в верхнем ряду.

yOffsetBetweenOrigins - это расстояние от верхнего края изображения до верхнего края изображения под ним. Если я установлю это на 80, а мое изображение будет 50px в высоту, то между рядами будет вертикальный промежуток в 30px.

numPerRow просто. Это просто количество изображений в строке.

Чтобы вычислить значение x в верхнем левом углу изображения, я всегда начинаю с leftInset, потому что оно постоянно. Если я нахожусь на первом изображении строки, это будет полное значение x. Если я на втором изображении строки, мне нужно добавить xOffsetBetweenOrigins один раз, а если я на третьем, мне нужно добавить его дважды.

Для этого я использую оператор модуля (%). Это дает мне остаток от операции деления, поэтому, когда я говорю imageNumber% numPerRow, я спрашиваю остаток от imageNumber / numPerRow. Если я нахожусь на первом изображении (imageNumber = 0), то 3 переходит в 0 без раз, а остаток равен 0. Если я на втором изображении (imageNumber = 1), то у меня есть 1/3. 3 входит в 1 0 раз, но остаток равен 1, поэтому я получаю xOffsetBetweenOrigins * 1.

Для значения y я делаю нечто подобное, но вместо того, чтобы брать модуль, я просто делю imageNumber / numPerRow и округляем вниз. При этом я получу 0 за 0, 1 и 2. Я получу 1 за 3, 4 и 5.

Edit:

Мне пришло в голову, что вы, возможно, на самом деле спрашивали, как использовать этот метод. В вашем коде вы бы сказали что-то вроде

CGRect newFrame = zenbutton2.frame;
newFrame.origin = [self getImageOrigin:i];
zenbutton2.frame = newFrame;

Другое Править:

Может быть, вы могли бы попробовать это?

CGPoint origin = [self getImageOrigin:i];
zenbutton2.frame = CGRectMake(origin.x, origin.y, width, height);

Если это не сработает, добавьте

NSLog("Origin Values: %f,%f", origin.x, origin.y);

чтобы убедиться, что вы действительно что-то получаете от getImageOrigin.

0 голосов
/ 27 июня 2011

Я думаю, что вы, вероятно, хотите заключить свой цикл в другой цикл, чтобы получить то, что я собираюсь назвать 2D циклом:

for (int row = 0; row < num_rows; row++) {
   for (int col = 0; col < num_cols; col++) {
        // code before
        zenButton2.frame = CGRectMake(origin x dependent on col,
                                      origin y dependent on row,
                                      width,
                                      height);
        // code after
   }
}

Где x и y из CGRectMake() - это кратные ширины и высоты изображения, умноженные на строку и столбец соответственно.Надеюсь, что это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...