2013-05-27 3 views
5

У меня есть UIView, высота и ширина которого при повороте до 90 градусов взаимозаменяемы. Теперь, когда я пытаюсь увеличить высоту или ширину, я получаю ненормальные взгляды. Как изменить высоту вращения UIView?Поверните UIView без изменения рамки

+0

Я просто нужен способ изменить угол, как он появляется на экране. –

+5

'view.transform = CGAffineTransformMakeRotation (M_PI/2);' –

+1

Пример 90 градусов. Я поворачиваю представление вручную. Когда я это делаю, меняются высота и ширина. Мне нужно просто изменить угол обзора на экране. –

ответ

8

В документации Apple указано, что свойство представлений frame не определено, если transform не является преобразованием идентичности.

Вращающийся вид изменяет преобразование вида.

Теперь, почему это делает недействительным рамку? Документация Apple на самом деле немного неточна: свойство frame не становится совершенно бессмысленным для преобразованных представлений. Вместо этого теперь он будет отображать ограничивающий прямоугольник вида, т. Е. Наименьший вертикальный прямоугольник, в который может вписаться преобразованное представление.

Это потому, что frame на самом деле является производным имуществом. Если вы хотите изменить «реальную высоту» преобразованного вида, то есть высоту в своей собственной системе координат (до применения преобразования), для этого есть свойство: bounds.

Итак, в двух словах:

CGRect bounds = myView.bounds; 
bounds.size.height = newHeight; 
myView.bounds = bounds; 
+0

Итак, если я введу эти строки в свой код, где я должен добавить CGAffineTransformMakeRotation часть? После или раньше? –

+0

Чувак, ты сделал мой день. Черт возьми, приятель. –

+0

Спасибо; Рад, что смог помочь! Для записи (я уверен, вы уже поняли это сами): если вы меняете границы, неважно, изменяете ли вы трансформацию до или после. Если вы меняете фрейм, обязательно сделайте это только в том случае, если 'CGAffineTransformIsIdentity (myView.transform)' ДА (то есть перед изменением преобразования). Отправляйте это сообщение в блоге (не я) для получения дополнительной информации о фреймах и ограничениях: http://ashfurrow.com/blog/you-probably-dont-understand-frames-and-bounds – fzwo

1

Используйте следующий метод ...

- (void) runSpinAnimationOnView:(UIView*)view duration:(CGFloat)duration rotations:(CGFloat)rotations repeat:(float)repeat; 
{ 
    CABasicAnimation* rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; 
    rotationAnimation.duration = duration; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = repeat; 

    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 
Смежные вопросы