Повернуть вид и подпредставления - PullRequest
0 голосов
/ 26 июня 2018

У меня проблема с поворотом изображения с подпредставлениями в приложении для iOS 9+.У меня есть контейнер, содержащий 2 подпредставления.Подвиды имеют тот же размер, что и вид контейнера.Первое подпредставление содержит изображение со страницы PDF.Второе подпредставление содержит UIImageViews как подпредставления, которые располагаются поверх изображения PDF.Я использую систему координат PDF для правильного размещения и размера изображений.(Может быть, я должен упомянуть, что контейнерное представление само по себе является подпредставлением UIScrollview).

Представления изображения правильно расположены и ориентированы независимо от того, является ли PDF книжным или альбомным.Однако, когда PDF-файл в альбомной ориентации, я хотел бы повернуть и масштабировать конечное изображение, чтобы оно отображалось нормально.Один из способов сделать это - вращать, преобразовывать и масштабировать PDF и каждый вид изображения по отдельности, добавляя код для рисования в метод drawRect каждого вида.Это работает, но очень медленно.

Из сообщения SO я узнал, что если я применяю вращение и преобразование к CALayer представления контейнера, iOS применяет изменения ко всей иерархии представления.Это происходит намного быстрее при повороте изображения ландшафта.Но я не смог масштабировать конечное изображение, используя слой вида контейнера.На iPad у меня получилось правильно повернутое окончательное изображение, центрированное по горизонтали вверху экрана, но обрезанное с левой и правой сторон.Длинная ось изображения по-прежнему равна высоте экрана, шире ширины экрана.

Код в представлении контейнера действительно короткий:

- (void) setOrientation:(NSInteger)orientation
{
    _orientation = orientation;
    if (orientation == foPDFLandscape)
    {
//        [[self layer] setNeedsDisplayOnBoundsChange:YES];// no effect
//        [[self layer] setBounds:CGRectMake(0.0, 0.0, 100.0, 100.0)];//does not change image size or scale
//        [[self layer] setContentsScale:0.5];//does not change image size or scale

        [[self layer] setAnchorPoint:CGPointMake(0.0, 0.9)];
        CATransform3D transform = CATransform3DMakeRotation(90.0 * (M_PI / 180.0), 0.0, 0.0, 1.0);
        [[self layer] setTransform:transform];

//putting the scaling code here instead of before the transform makes no difference
    }
}

Настройкаbounds, frame или contentScale, до или после преобразования и в различных комбинациях, не влияет на конечное изображение.Также не меняются значения гравитации содержимого и autoResizeMask.

Есть ли способ, которым я могу это сделать?

Спасибо

1 Ответ

0 голосов
/ 27 июня 2018

Мне нужно было объединить преобразования следующим образом:

- (void) setOrientation:(NSInteger)orientation
{
    _orientation = orientation;
    if (orientation == foPDFLandscape)
    {
        [[self layer] setAnchorPoint:CGPointMake(0.0, 1.0)];
        CATransform3D rotate = CATransform3DMakeRotation(90.0 * (M_PI / 180.0), 0.0, 0.0, 1.0);
        CATransform3D scale = CATransform3DMakeScale(0.77, 0.77, 1.0);
        CATransform3D concat = CATransform3DConcat(rotate, scale);
        [[self layer] setTransform:concat];
    }
}

Но это частичное решение.Окончательное изображение обрезается до размера экрана - хорошо на iPad, но не на iPhone.Кроме того, изображение больше не реагирует на жесты для увеличения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...