【问题标题】:Animating a UIButton to fullscreen将 UIButton 动画化为全屏
【发布时间】:2016-04-09 20:47:13
【问题描述】:

所以我有一个非常简单的按钮,当单击它时会进入全屏状态,当再次单击时会返回到它最初所在的位置。由于某种原因,它在没有动画的情况下也能完美运行。当我最初单击按钮时取消注释动画部分时,它什么也不做,第二次单击它时会稍微放大。第三次点击动画很慢,但又变小了……为什么动画反了?

- (IBAction)viewImage1:(id)sender {
    UIButton *btn = (UIButton*) sender;
    if (btn.tag == 0)
    {
        CGRect r = [[UIScreen mainScreen] bounds];
        /*[UIView animateWithDuration:0.5f delay:0.0f options:0 animations:^{*/
        [sender setFrame: r];
        /*}completion:nil];*/
        btn.tag = 1;
    }
    else
    {
        btn.tag = 0;

        [sender setFrame:CGRectMake(0,0,370,200)];
    }
}

【问题讨论】:

  • 什么样的动画?
  • 我假设要将发送者按钮设置为 mainScreen 边界的动画,我设置了动画:^{ [sender setFrame: r];} 对吗?
  • 您的代码运行良好。你遇到了什么问题?
  • 它不会动画到全屏;它略微伸展。您是否取消了我遇到问题的部分的注释?
  • 我认为动画只有在你在动画之前改变一帧时才会起作用,因此在你的情况下,当你第二次点击时动画才会起作用

标签: ios objective-c animation uibutton


【解决方案1】:

您的问题有两种解决方案,其中任何一种都可以:

  1. 禁用自动布局。 (不鼓励)
    您可以通过打开文件检查器在 Interface Builder 中执行此操作



    在右侧窗格中并取消选中相应的复选框。



    但是,如果您想使用 Autolayout 来约束视图中的其他 UI 元素(在大多数情况下这是个好主意),这种方法将不起作用,这就是我推荐第二种解决方案的原因:

  2. 启用自动布局,在视图控制器中为您的按钮创建一个插座并设置

    self.myButton.translatesAutoresizingMaskIntoConstraints = YES;
    

    在您的视图控制器的viewDidLoad 方法中。

    您还可以为按钮添加布局约束并为其设置动画。 (这个出色的 Stackoverflow post 解释了它是如何完成的。)

原因是,一旦您启用自动布局,视图的框架就不再与屏幕上显示的实际布局相关,只有视图的布局约束很重要。将其translatesAutoresizingMaskIntoConstraints 属性设置为YES 会导致系统自动为您的视图创建布局约束,以某种方式“模拟”您设置的框架。

【讨论】:

  • 很高兴它成功了。您可能需要考虑接受正确的答案并投票支持任何对您有帮助的答案,以便有类似问题的其他用户可以立即找到有效的解决方案。这有点像感谢那些写答案的人。 :)
【解决方案2】:

使用自动布局和约束更容易做到这一点。为按钮的高度约束创建一个 IBOutlet,将其命名为 btnHeight。对宽度约束执行相同的操作,将其称为 btnWidth。然后像这样创建一个 IBAction:

- (IBAction)buttonPress:(UIButton *)sender {
    UIButton *btn = (UIButton *) sender;
    CGRect r = [[UIScreen mainScreen] bounds];
    if (CGRectEqualToRect(btn.frame, CGRectMake(0.0, 0.0, 370, 200))) {
        [UIView animateWithDuration:0.5 delay:0.0 options:0 animations:^{
            self.btnHeight.constant = r.size.height;
            self.btnWidth.constant = r.size.width;
            [self.view layoutIfNeeded];
        } completion:^(BOOL finished){
        }];
    }else{
        [UIView animateWithDuration:0.5 delay:0.0 options:0 animations:^{
            self.btnHeight.constant = 200.0;
            self.btnWidth.constant = 370.0;
            [self.view layoutIfNeeded];
        } completion:^(BOOL finished){
        }];
    }

}

根据我的经验,为 UIButton 的框架设置动画效果不佳,我知道,唯一的方法是使用 CGAffineTransformScale,它将光栅化按钮的标题并对其进行缩放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 2015-09-16
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多