Если я понимаю, что вы говорите, вы сможете написать простой блок кода, который назначает позицию на основе номера изображения.
Примерно так (где 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
.