2

我在调整按钮宽度大小的动画时遇到了一些麻烦。这是我的代码:

- (IBAction)profileButtonPressed:(UIButton *)sender {
    UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
    [sender setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal];

    UIImage *buttonProfileDefaultDown = [[UIImage imageNamed:@"Profile_Button_Default_Down"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
    [sender setBackgroundImage:buttonProfileDefaultDown forState:UIControlStateHighlighted];

    [sender setTitle:@"LOG OUT" forState:UIControlStateNormal];

    sender.titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    sender.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    // Animate
    CGRect originalFrame = sender.frame;
    originalFrame.size.width = sender.frame.size.width+60;
    [UIView animateWithDuration:1.5 animations:^{
        sender.frame = originalFrame;
    }];
}

它改变了按钮的宽度(除非我去掉了改变标题的那段代码),但它并没有通过动画来做到这一点。

有什么建议可能是错的吗?

更新

所以我设法为宽度变化设置动画,但将 setTitle 放在动画部分,但它没有为文本本身获得正确的宽度(下图)。我怎样才能做到这一点?

在此处输入图像描述

解决方案

所以我最终以编程方式放置了uibutton。似乎自动布局导致了问题。

是我自己还是Objective C中有很多东西有点笨拙?!

4

4 回答 4

2

我怀疑您的问题与内在内容大小有关。如果已设置(我认为这是默认设置),那么当您更改标题时,按钮将更改大小,没有动画,无需您在代码中执行任何操作。有几种方法可以解决这个问题。我认为最简单的方法是将 IB 中按钮的大小扩大一点,即使一个像素也足以让 IB 设置明确的宽度(或者您可以自己设置)。然后在代码中,你可以这样做:

-(IBAction)buttonClick:(UIButton *)sender {
    [sender setTitle:@"Log Out Immediately" forState:UIControlStateNormal];
    [self.button removeConstraint:self.lengthConstraint];
    [UIView animateWithDuration:.5 animations:^{
        self.button.frame = CGRectMake(self.button.frame.origin.x, self.button.frame.origin.y, 250, 44);
    }];
}

self.lengthConstraint 是在 IB 中设置的长度约束的 IBOutlet。

另一种方法是使用 NSTimer 更改约束方法中的常量。这是 WWDC 2012 演讲“掌握自动布局的最佳实践”中提到的方法之一:

-(IBAction)buttonClick:(UIButton *)sender {
    [sender setTitle:@"Log Out Immediately" forState:UIControlStateNormal];
    [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(expandButton:) userInfo:nil repeats:YES];
}

-(void)expandButton:(NSTimer *) timer {
    self.lengthConstraint.constant += 2;
    if (self.lengthConstraint.constant > 170) [timer invalidate];
}
于 2012-11-27T05:40:53.827 回答
0

在制作动画之前移除setTitle并在完成块中执行。

    CGRect originalFrame = sender.frame;
    originalFrame.size.width = sender.frame.size.width+60;

    [UIView animateWithDuration:1.5 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        sender.frame = originalFrame;
    } completion:^{
        [sender setTitle:@"LOG OUT" forState:UIControlStateNormal];
    }];

更新: 检查您是否使用自动布局功能。我不确定,但这应该是这里的问题。正如我在以编程方式创建按钮时在评论中提到的那样,这对我有用。

于 2012-11-27T00:38:42.507 回答
0

解决方案

所以我最终以编程方式放置了uibutton。似乎自动布局导致了问题。

是我自己还是Objective C中有很多东西有点笨拙?!

于 2012-12-20T21:36:23.670 回答
0

一旦你开始使用自动布局,你应该停止修改框架,而是修改视图的约束值。

您可以IBOutlet向按钮的宽度约束添加一个并修改其constant值。

于 2015-09-30T15:40:02.737 回答