2014-03-19 6 views
4

Я хочу повернуть мой UIButtonM_PI/4 с анимацией. Вот мой код:Как повернуть UIView на 45 градусов?

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [UIView animateWithDuration:.5 animations:^{ 
     self.closeButton.transform = CGAffineTransformMakeRotation(M_PI/4); 
    }]; 
} 

Но это делает раму моей кнопки поврежденной. Рамка перед анимацией была (260 0; 44 44), и после анимации она становится (250.887 -9.1127; 62.2254 62.2254). Я видел this пост и несколько других, но я не понимаю, как добиться анимационного вращения UIButton на M_PI/2.

+1

Есть проблема, не будучи в состоянии повернуть кнопку или, что кнопка активна рама повреждена? – Aaron

+0

@ Аарон, проблема в том, что я хочу повернуть кнопку вокруг своего центра, но вместо этого я получаю невидимую кнопку с поврежденным фреймом. –

+1

Под «фреймом» вы подразумеваете значения свойства 'frame', или вы имеете в виду границу кнопка? – DarkDust

ответ

3

frame property недействителен после применения преобразования. Согласно документации:

Предупреждения: Если свойство преобразования не является преобразованием личности, значение этого свойства не определенно и, следовательно, должно быть проигнорировано.

До тех пор, пока результат выглядит в порядке, это ожидается поведение.

Если вы хотите переместить кнопку, вам нужно сохранить преобразование, сбросить его до CGAffineTransformIdentity, установить новый кадр, а затем повторно применить старое преобразование. В качестве альтернативы вы можете получить и изменить его свойство center, даже если применяется преобразование.

+0

Я попытался сохранить центр перед преобразованием и установить старый центр, безуспешно –

+2

Боюсь, мы все еще догадываемся, что вы на самом деле имеете в виду. Вы должны быть более конкретными: 1) поворачивается ли кнопка, когда вы ее не оживляете, и когда вы не меняете центр/фрейм? 2) Вы можете видеть кнопку, но она выглядит искаженной? 3) Вы видите кнопку, но это не то место, где вы хотите? – DarkDust

2

frame UIView - это самый маленький прямоугольник, который полностью закрывает вид. Когда вы поворачиваете на PI/2, рамка будет расширяться на sqrt (2), а начало координат будет настроено так, чтобы центр находился в одной и той же точке, что и произошло.

Если вы хотите кнопку, чтобы повернуть и держать его же кадр, вам нужно раздавить кнопки, как она вращается, как это

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    CGFloat w = self.closeButton.bounds.size.width/sqrtf(2.0f); 
    CGFloat h = self.closeButton.bounds.size.height/sqrtf(2.0f); 
    NSLog(@"%@ w=%f", NSStringFromCGRect(self.closeButton.bounds), w); 

    [UIView animateWithDuration:.5 animations:^{ 
     self.closeButton.transform = CGAffineTransformMakeRotation(M_PI/4); 
     self.closeButton.bounds = CGRectMake(0, 0, w, h); 
    }]; 

    NSLog(@"%@", NSStringFromCGRect(self.closeButton.frame)); 
} 
+0

Установка границ не влияет на фрейм. Таким образом, вы можете иметь представление, имеющее другую «внутреннюю» систему координат, чем снаружи. Когда вы поворачиваете представление, «внутренняя» система не знает, что она повернута и, следовательно, ее размер не должен изменяться. – DarkDust

+0

Вздох, попробуйте код, распечатайте рамку до и после. Будьте просветлены. – user3386109

+0

Вы правы, это _does_ влияет на фрейм (узнал, что размеры связаны). Но это не влияет на отображаемую кнопку в малейшей степени, как только применяется преобразование (используется с кнопкой текста и изображения и измеряется результат). Это происходит, когда преобразование является идентичным. Можно легко протестировать путем удвоения 'w' и' h', а затем посмотреть результат с настройкой преобразования или без него. – DarkDust

Смежные вопросы