Проблемы с CGAffineTransformMakeRotation и Autolayout в iOS8

После применения преобразования вращения на простом UIView

CGAffineTransform trans = CGAffineTransformMakeRotation(M_PI * -0.5);

simpleVIew_.transform = trans;

Что имеет следующие ограничения

[self addConstraints:@[
   [NSLayoutConstraint constraintWithItem: simpleView_ attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual
                                   toItem:nil attribute:NSLayoutAttributeNotAnAttribute
                               multiplier:1 constant:50],

   [NSLayoutConstraint constraintWithItem: simpleView_ attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual
                                   toItem:self attribute:NSLayoutAttributeHeight
                               multiplier:1 constant:270],

   [NSLayoutConstraint constraintWithItem: simpleView_ attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual
                                   toItem:self attribute:NSLayoutAttributeLeft
                               multiplier:1.0 constant:0],

   [NSLayoutConstraint constraintWithItem: simpleView_ attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual
                                   toItem:self attribute:NSLayoutAttributeBottom
                               multiplier:1.0 constant:0]

]];

Я получаю два разных результата между iOS7.1 и iOS8 beta 5:

iOS7.1

<UIView: 0x1655d990; frame = (0 30; 50 270); transform = [0, -1, 1, 0, 0, 0]; opaque = NO; layer = <CALayer: 0x1655dab0>

iOS8 beta 5

<UIView: 0x16e5a530; frame = (-110 140; 270 50); transform = [0, -1, 1, 0, 0, 0]; opaque = NO; layer = <CALayer: 0x16e61880>>

Обратите внимание на различия в кадре - значения ширины/высоты переключились и изменились координаты x, y.

Любые идеи, почему существует такая огромная разница между 7.1 и 8?

Ответ 1

На самом деле это не решение, а большая часть работы.

Я обнаружил, что верхние, нижние, левые и правые ограничения ведут себя по-разному при построении на iOS 8 и iOS 7 при использовании CGAffineTransformMakeRotation. Однако CenterX и CenterY ведут себя одинаково для каждого. Кроме того, ограничения по высоте и ширине будут вести себя одинаково до тех пор, пока вы addConstraint к тому же самому виду вы constraintWithItem.

Итак, если вы можете изменить свои ограничения для представления, которое использует CGAffineTransformMakeRotation, чтобы использовать только высоту, ширину, CenterX, CenterY, то вы должны иметь одинаковые ограничения, одинаковые при создании на обеих версиях iOS.

Ниже приведен пример моего собственного кода, который давал мне тот же макет, независимо от версии iOS:

// Rotate View 90º
endorseHereLabel.transform = CGAffineTransformMakeRotation(-(M_PI)/2);

[self addSubview:endorseHereLabel];
[self bringSubviewToFront:endorseHereLabel];

// Configure Constraints
[self addConstraint:[NSLayoutConstraint constraintWithItem:endorseHereLabel
                                                 attribute:NSLayoutAttributeCenterY
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:lineView1
                                                 attribute:NSLayoutAttributeCenterY
                                                multiplier:1.0
                                                  constant:40.0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:endorseHereLabel
                                                 attribute:NSLayoutAttributeCenterX
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:lineView1
                                                 attribute:NSLayoutAttributeCenterX
                                                multiplier:1.0
                                                  constant:kBottomBuffer]];
[endorseHereLabel addConstraint:[NSLayoutConstraint constraintWithItem:endorseHereLabel
                                                             attribute:NSLayoutAttributeHeight
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:nil
                                                             attribute:NSLayoutAttributeNotAnAttribute
                                                            multiplier:1.0
                                                              constant:12.0]];
[endorseHereLabel addConstraint:[NSLayoutConstraint constraintWithItem:endorseHereLabel
                                                             attribute:NSLayoutAttributeWidth
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:nil
                                                             attribute:NSLayoutAttributeNotAnAttribute
                                                            multiplier:1.0
                                                              constant:250.0]];

Ответ 2

Попробуйте добавить простой вид в представление контейнера. Я видел похожие проблемы, по крайней мере, в двух моих представлениях, и в обоих случаях добавление их в представление контейнера, похоже, устраняет проблему.

Edit

То, что я подразумеваю под видом контейнера, просто добавляет простой вид в UIView, а затем применяет ограничения и вращение к контейнеру.

Ответ 3

Документация:

@property (неатомное) Преобразование CGAffineTransform

Происхождение преобразования - это значение свойства центра, или свойство anchorPoint слоев, если оно было изменено. (Используйте слой чтобы получить базовый объект слоя Core Animation.) Значение по умолчанию - CGAffineTransformIdentity.

Перед поворотом необходимо установить опорную точку вашего представления.

<я >

yourView.layer.anchorPoint = CGPointMake (0,5, 0,5);

Значения должны быть между 0 и 1.

enter image description here

Пример здесь

Может быть изменено значение по умолчанию CGAffineTransformIdentity?