0

Я экспериментирую с блочным устройством iOS, чтобы узнать больше об особенностях пользовательского интерфейса. В настоящее время у меня возникают проблемы с попыткой заставить его работать для вращения экрана.UIImageView autoresizingmask не работает в некоторых случаях

Я могу получить блоки для правильной настройки после вращения экрана, но у меня возникли проблемы с получением UIImageView для замены весла.

Мой код разделен следующим образом, вызовы VC инициализируют объект класса BlockModel. Этот объект сохраняет свойство CGRect (которое является CGRect, соответствующим ImageView).

Затем VC создает изображениеView, инициализированное с помощью изображения весла, устанавливает свойство автообновления в виде изображения (для создания гибких внешних масок), устанавливает кадр на основе CGRect в объекте модели и добавляет изображение в качестве вспомогательного объекта - просмотр основного вида, обрабатываемого VC.

Код приведен ниже.

Когда я поворачиваюсь, я вижу, что ImageView не будет автоматически изменен.

Если я делаю все изображение и создание CGRect в vC, то он работает (пример кода 2).

Ожидается ли такое поведение? Если да, то почему авторезистирование не срабатывает, если CGRect получен из свойства в другом объекте?

код проекта Full Xcode является here (ссылка GitHub)

EDIT Похоже вещи не работают, если я хранить ImageView как свойство. Я делал это, чтобы иметь быстрый доступ к нему. Почему он не работает, если изображениеView хранится как свойство?

код где инициализируется модель

self.myModel = [[BlockerModel alloc] initWithScreenWidth:self.view.bounds.size.width           andHeight:self.view.bounds.size.height]; 

инициализации Код модели

-(instancetype) initWithScreenWidth:(CGFloat)width andHeight:(CGFloat)height 
{ 
    self = [super init]; 

    if (self) 
    { 
     self.screenWidth = width; 
     self.screenHeight = height; 
     UIImage* paddleImage = [UIImage imageNamed:@"paddle.png"]; 
     CGSize paddleSize = [paddleImage size]; 
     self.paddleRect = CGRectMake((self.screenWidth-paddleSize.width)/2, (1 - PADDLE_BOTTOM_OFFSET)*self.screenHeight, paddleSize.width, paddleSize.height); 
    } 

    return self; 
} 

код в VC, где инициализируется ImageView

self.paddleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"paddle"]]; 
self.paddleView.backgroundColor = [UIColor clearColor]; 
self.paddleView.opaque = NO; 
self.paddleView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin; 
NSLog(@"Paddle rect is %@",NSStringFromCGRect(self.myModel.paddleRect)); 
[self.paddleView setFrame:self.myModel.paddleRect]; 
[self.view addSubview:self.paddleView]; 

Если я вместо этого использовать этот код в VC для инициализации ImageView вещи работают

UIImage* paddleImage = [UIImage imageNamed:@"paddle.png"]; 
    CGSize paddleSize = [paddleImage size]; 

    CGRect paddleRect = CGRectMake((self.view.bounds.size.width-paddleSize.width)/2, (1 - PADDLE_BOTTOM_OFFSET)*self.view.bounds.size.height, paddleSize.width, paddleSize.height); 
    UIImageView *paddleView = [[UIImageView alloc] initWithImage:paddleImage]; 
    paddleView.backgroundColor = [UIColor clearColor]; 
    paddleView.opaque = NO; 
    paddleView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin; 

    [paddleView setFrame:paddleRect]; 
    [self.view addSubview:paddleView]; 

ответ

0

Найдено вопрос. Я использовал объект модели для обработки всей логики моего «игрового объекта». Например, VC будет вычислять дельты оси X от событий касания & пересылать их объекту модели. Кроме того, события CADisplayLink будут перенаправлены таким образом, чтобы модель могла обновлять местоположение шара на основе скорости и времени с момента последнего события. Затем он будет использовать обновленное местоположение для обнаружения коллизий. Этот раскол был использован, потому что у класса модели также были методы для обнаружения столкновений со сторонами, веслом/шаром и т. Д.

Проблема заключалась в том, что объект модели переписывал CGRect paddleView, добавляя дельта, полученную от VC, к origin.x текущего paddleRect он сохранил.Этот paddleRect не учитывал автоматическую настройку CGRect, которая выполняется путем автоматического изменения размера после вращения.

Исправление было связано с тем, что VC установил CGRect элемента paddleRect (установленный в кадр paddleView) перед вызовом метода в модели для обновления всех свойств игры и обнаружения коллизий. Таким образом, модель только заботится о логике обнаружения сговора и обновлении движения шара и скорости на его основе. VC использует текущее местоположение paddleView и, следовательно, автоматически учитывает автоматическую настройку CGRect, которая выполняется путем автоматического изменения размера после поворота.

Исходный код в ссылке github обновлен.

Смежные вопросы