Проблема с CGRectMake

#iphone #objective-c #cocoa-touch

#iPhone #objective-c #cocoa-touch

Вопрос:

Я пытался создать сетку на iPhone из изображений 16×16.

 - (void)viewDidLoad {
    [super viewDidLoad];

    int xLocation = 0;

    for (int i=0; i <= 619; i  ) {


        if (((i % 30) == 0) amp;amp; i != 0) { //if at end of column (30th row), moves x over 16 px to next column
            xLocation  = 16;
        }
        else {;}


    CGRect imageRect = CGRectMake( xLocation, (16*i), 16, 16);
    UIImageView *image = [[UIImageView alloc] initWithFrame:imageRect];
    [image setImage:[UIImage imageNamed:@"Untitled-1.png"]];
    [image setOpaque:YES];

        NSLog(@"%d", xLocation);


    [self.view addSubview:image];
    [image release];
    }
  

Проблема заключается в расположении int XL. По какой-то причине CGRectMake использует 0 в слоте с координатами x вместо xLocation. Я говорю «вместо», потому что приведенный ниже NSLog показывает, что xLocation имеет значения, которые я хочу, поэтому присвоение значений работает нормально. Что здесь происходит?

Ответ №1:

Приведение xLocation в качестве int в вашем NSLog, безусловно, сработает, но вы также могли бы использовать:

 NSLog(@"imageRect %@", NSStringFromCGRect(imageRect));
  

Существует целый ряд вспомогательных функций NSStringFromXXX, которые время от времени пригодятся.

Ответ №2:

Местоположение XL равно 0 для первого столбца, и оно увеличивается для каждого столбца, но координата y не сбрасывается на 0 для каждого нового столбца. Он просто продолжает увеличиваться на основе i. Таким образом, столбцы, начиная со второго, находятся за пределами экрана в правильном месте xl, но имеют высокое значение y.

Попробуйте изменить вычисление imageRect на:

 CGRect imageRect = CGRectMake( xLocation, (16*(i % 30)), 16, 16);
  

Комментарии:

1. Большое спасибо, я сосредоточился на xLocation, который на самом деле не был проблемой.

Ответ №3:

%d неправильно отображает значения float. Используйте %f или преобразуйте xLocation в int:

 NSLog(@"%d", (int)xLocation);
  

Вы также можете упростить читаемость расчета xLocation, вычисляя его каждый раз, что-то вроде

 16 * (i / 30)
  

Накладные расходы минимальны на современных процессорах.

Комментарии:

1. xLocation имеет тип int .