Как изменить изображение UIImageView в контроллере представления в traitCollectionDidChange - PullRequest
0 голосов
/ 13 февраля 2019

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

Следующая функция определенно вызывается, когда телефон вращается, потому что моя функция printf печатает на выход.

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {

    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || (self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        printf("Orientation Change!\n");
        UIImage * newImage = [UIImage imageNamed: @"landscape-image"];
        [self.imageView setImage:newImage];
    }
}

Я определил свойство imageView в моем файле .h следующим образом:

@property (nonatomic, nonnull, readonly) UIImageView * imageView;

И я инициализирую imageView следующим образом:

UIImage * image = [UIImage imageNamed:@"portrait-image"];
UIImageView * _imageView = [[UIImageView alloc] initWithImage:image];
_imageView.contentMode = UIViewContentModeScaleAspectFill;
_imageView.translatesAutoresizingMaskIntoConstraints = NO;
[pageView addSubview:_imageView];

Это не работает для меня, хотя.Когда я меняю ориентацию, изображение imageView остается тем же и увеличивается, как обычно.Поскольку при вращении телефона вызывается функция traitCollectionDidChange, я предполагаю, что проблема заключается в том, как я меняю изображение.Я относительно новичок в разработке для iOS, поэтому мне может не хватать чего-то важного для обновления UIImageViews.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 13 февраля 2019

Когда вы создаете imageView, используя UIImageView * _imageView = [[UIImageView alloc] initWithImage:image];, вы скрываете автоматически синтезированную переменную _imageView с новой переменной с тем же именем.

Вновь созданный экземпляр UIImageView, следовательно, не назначен свойству imageView.В результате, когда устройство поворачивается и запускается второй метод, self.imageView имеет значение nil, и вы вызываете [self.imageView setImage:newImage] ничего не делает.

Чтобы решить эту проблему, все, что вам нужно сделать, заменить UIImageView * _imageView = [[UIImageView alloc] initWithImage:image]; на _imageView = [[UIImageView alloc] initWithImage:image];

Подробнее о путанице автоматически синтезируемых свойств в Objective-C в этом ответе Когда я должениспользовать @synthesize явно?

EDIT -

Кроме того, - (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection может быть вызван в любое время и на начальном этапе, поэтому вы хотите определить ориентацию в этом методе., а не просто установить изображение для вашего изображения ландшафта.

(и в связи с этим - возможно, вы захотите переоценить ваши требования в отношении «ландшафтного» или «портретного» изображения, поскольку приложения для iOS могут работать в различных средах, iPad / iPhone / compact .. это сложно. https://developer.apple.com/documentation/uikit/uitraitcollection)

Чтобы завершить ответ, это должно работать на iPhone

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {

    [super traitCollectionDidChange: previousTraitCollection];

    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || (self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {

         if (self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
              [self.imageView setImage:[UIImage imageNamed: @"landscape-image"]];
         } else if (self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular
                    && self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
             [self.imageView setImage:[UIImage imageNamed: @"portrait-image"]];
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...