如何将UIView旋转45度?

6

我想使用动画将我的UIButton旋转M_PI/4。以下是我的代码:

- (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和其他一些帖子,但我不明白如何通过M_PI/2实现UIButton的旋转动画。

1
问题是无法旋转按钮还是按钮的框架已损坏? - Aaron
@Aaron,问题是我想让按钮围绕其中心旋转,但我得到的是不可见的按钮和损坏的框架。 - Valentin Shamardin
1
“frame”这个词,您是指“frame”属性的值还是指按钮的边框? - DarkDust
3个回答

4

Xcode - 10
Swift - 4x

self.yourView.transform = CGAffineTransform(rotationAngle: .pi/4)

这可以帮助您将UI视图旋转45度


3
frame属性在应用转换后无效。根据文档:

警告:如果变换属性不是标准变换,此属性的值未定义,应忽略。

所以只要结果看起来没问题即为预期行为。

如果你想移动按钮,需要先保存变换,将其重置为CGAffineTransformIdentity,设置新的框架,然后再应用旧的变换。或者,即使应用了变换,您也可以访问和修改框架的center属性。


我尝试在变换之前保存中心并设置旧中心,但未成功。 - Valentin Shamardin
2
很抱歉,我们仍然在猜测您的真实意图。您需要更加具体地说明: 1)当您不进行动画并且不改变中心/帧时,按钮是否会旋转? 2)您能看到按钮,但它看起来扭曲吗? 3)您能看到按钮,但它不在您想要的位置吗? - DarkDust

3
UIView的“frame”是完全包含视图的最小矩形。当您以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 ) );
}

设置边界不会影响框架。这样,您可以使视图具有与外部不同的“内部”坐标系统。当您旋转视图时,“内部”系统不知道它已经旋转,因此不需要修改其大小。 - DarkDust
叹气,尝试运行代码,打印出前后的框架。获得启示。 - user3386109
你说得对,它确实会影响框架(发现大小是耦合的)。但是一旦应用了变换,它并不会对显示的按钮产生任何影响(尝试使用文本和图像按钮并测量结果)。当变换为恒等变换时,它会产生影响。可以通过将“w”和“h”加倍来轻松测试,然后观察是否设置了变换的结果。 - DarkDust
我猜你正在与自动布局作斗争。在一个禁用了自动布局的项目中尝试一下这个。 - user3386109
是的,关闭自动布局确实有所改变:现在,如果我搞乱边界,视图不再围绕其中心旋转,旋转点略微偏移。我仍然坚持我的最初观点:在这里搞乱边界是不必要的。如果你只想让它围绕其中心旋转45度,设置变换并完成即可。但除非OP最终解释他的问题,否则我们将无法帮助他。 - DarkDust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接