Как установить преобразование вращения, которое не искажает вращение устройства? - PullRequest
2 голосов
/ 03 сентября 2011

Я занимаюсь разработкой приложения для iPad, в котором есть набор экземпляров UIButton, где я делаю небольшое вращение CGAffineTransform в viewWillAppear:, чтобы они не были идеально выровнены на экране.Однако возникает проблема, когда устройство поворачивается в любом направлении, а фоновое изображение кнопки становится все более и более искаженным, чем больше оно поворачивается:

Правильно:

enter image description here

После нескольких поворотов устройства:

enter image description here

Вот код, который я использую для анимации представления на viewDidAppear::

/*
 *  Animate video button
 */

CGPoint videoCenter = self.videoButton.center;

self.videoButton.center = CGPointMake(self.videoButton.center.x + 25.0f, self.videoButton.center.y + 25.0f);

[UIView animateWithDuration:0.5f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     self.videoButton.center = videoCenter;
                     self.videoButton.transform = CGAffineTransformRotate(CGAffineTransformIdentity, [self convertDegreesToRadians:4.0f]);
                 }
                 completion:^(BOOL finished) {
                     // Do Nothing
                 }];

Я попытался сбросить преобразование до того, что мне нужно, чтобы оно было в willRotateToInterfaceOrientation:, и, хотя оно уменьшает степень, до которой это происходит, после ряда поворотов оно дает аналогичный результат.

У меня естьпопытался изменить autoresizesSubviews основного вида на NO:

self.view.autoresizesSubviews = NO;

Но затем я должен полностью разложить свою альбомную ориентацию вручную, чего я хочу избежать.

Как настроить преобразование вращения, чтобы оно не искажало фоновые изображения моего UIButton при ориентации устройства?

ОБНОВЛЕНИЕ:

Я добавил несколько операторов журнала в viewWillRotateToInterfaceOrientation: и заметил, что ширина кнопки увеличиваетсяг.Это объясняет искажение изображения, но почему оно даже меняется?Это кажется мне странным:

width       height
-------------------------------
268.574524  149.81514
286.267822  150
304.092621  150
321.91745   150
339.742279  150
357.567078  150
374.401642  150
391.236206  150
409.061066  150
425.895599  150
442.730164  150
459.564728  150
476.399292  150
493.233826  150
509.078125  150
524.922424  150
540.766663  150
556.611023  150

1 Ответ

0 голосов
/ 05 сентября 2011

Проблема, с которой вы столкнулись, может быть связана с автоматическим изменением размера, выполняемым UIViewController при повороте интерфейса.Я предлагаю вам следить за исходной рамкой вида изображения и восстанавливать эту исходную рамку в didRotateFromInterfaceOrientation:.Итак, в -viewDidLoad сделайте что-то подобное, чтобы сохранить кадр представления:

videoFrame = self.videoButton.frame;

В заголовке этого контроллера представления также следует объявить CGRect videoFrame, чтобы приведенный выше кодРабота.Теперь мы можем использовать этот сохраненный фрейм после изменения ориентации интерфейса:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)orientation {
    CGPoint oldCenter = [self.videoButton center];
    [self.videoButton setTransform:CGAffineTransformIdentity];
    [self.videoButton setFrame:videoFrame];
    // restore previous center and rotation
    [self.videoButton setCenter:oldCenter];
    [self.videoButton setTransform:CGAffineTransformRotate(CGAffineTransformIdentity, [self convertDegreesToRadians:4.0f])];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...