6

当用户按下按钮然后为宽度设置动画时,我试图给我的 UIButton 一个新的背景图像。问题是按钮不缩放图像(我只使用视网膜图像)。

点击前:

在此处输入图像描述

点击后:

在此处输入图像描述

以及使事情发生的代码:

UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
        [self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal];

[self.profileButton removeConstraint:self.profileButtonConstraint];

// Animate
CGRect originalFrame = self.profileButton.frame;
originalFrame.size.width = 40;
[UIView animateWithDuration:0.2f
    animations:^{
        self.profileButton.frame = originalFrame;
    }
        completion:^(BOOL finished) {
    }];
4

8 回答 8

3

试试这个代码...

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [self.profileButton setBackgroundImage:[UIImage imageNamed:@"Profile_Button_Default"] forState:UIControlStateNormal];
    [self.profileButton setBackgroundImage:[UIImage imageNamed:@"Profile_Button_Default"] forState:UIControlStateSelected];
    [self.profileButton setFrame:CGRectMake(self.profileButton.frame.origin.x, self.profileButton.frame.origin.y, self.profileButton.frame.size.width + 40, self.profileButton.frame.size.height)];
    [UIView commitAnimations];

我希望这可以帮助你...

于 2012-12-06T13:13:20.013 回答
2

试试这个,而不是将图像分配为

UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];

做这个

UIImage *buttonProfileDefault = [UIImage imageNamed:@"Profile_Button_Default"];

无需设置 resizableImageWithCapInsets 的约束。

于 2012-12-06T07:11:45.203 回答
2

我在以下几点修改了您的代码:

  • 提供图像 Profile_Button_Default.png(或 .jpg 等)的完整名称,
  • 在正常情况下为图像添加状态,这些效果不会出现在按钮开始触摸时

现在检查:

UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
[self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal];
[self.profileButton setBackgroundImage:buttonProfileDefault
                              forState:UIControlStateSelected];
[self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateHighlighted];

[self.profileButton removeConstraint:self.profileButtonConstraint];

// Animate
CGRect originalFrame = self.profileButton.frame;
originalFrame.size.width = 40;
[UIView animateWithDuration:0.2f
                 animations:^{
                     self.profileButton.frame = originalFrame;
                 }
                 completion:^(BOOL finished) {
                 }];
于 2012-12-05T14:20:23.060 回答
2

您创建边缘插图的方式将保持最左边的 3 个和最右边的 3 个点(或像素)不变,并且会拉伸按钮上的头部。如果你想让头部的大小保持不变,你必须将它包含在左侧,留下 1 个像素可拉伸,然后是右侧。假设你的图片的宽度是 50,你会写:

UIImage * buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 46, 3, 3)];

但是,这会使您的图片位于按钮的左侧。我推荐的解决方案是使用 2 张图片:

  1. 仅包含按钮边框的可调整大小的图像,设置为按钮的背景图像
  2. 仅包含头部的图像,设置为恒定大小的按钮图像

代码看起来像:

UIImage *backgroundImage = [[UIImage imageNamed:@"border.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)]; // in this case you can use 3, 3, 3, 3

[self.profileButton setBackgroundImage:backgroundImage forState:UIControlStateNormal];

UIImage *titleImage = [UIImage imageNamed:@"head.png"];

[self.profileButton setImage:titleImage forState:UIControlStateNormal];

希望这可以帮助!

于 2012-12-02T09:00:45.263 回答
2

我认为问题在于您更改背景然后调整大小。

让它与自动布局一起工作的关键是为 widthConstraint 常量值设置动画,并在动画中设置背景图像。

例如,我的视图名称button上有一个按钮,我有一个名为buttonWidth的宽度约束的 IBOutlet - 下面是我的 buttonPress 的代码:

UIImage *imageButton = [[UIImage imageNamed:@"button"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)];

[UIView animateWithDuration:0.01f
                 animations:^{
                     [self.button setBackgroundImage:imageButton forState:UIControlStateNormal];
                 }
                 completion:^(BOOL finished) {
                     [UIView animateWithDuration:1.0f
                                      animations:^{
                                          self.buttonWidth.constant = 300;
                                          [self.view layoutIfNeeded];
                                      }
                                      completion:^(BOOL finished) {
                                      }];


                 }];

正如您在上面的代码中看到的那样,让它对我有用的关键是在动画中设置按钮背景,由于某种原因,如果我在动画之外更改了背景图像,它在动画完成之前不会正确设置。

使用 autoLayout 时也设置框架对我不起作用,所以我为约束常量设置了动画

于 2012-12-05T16:34:39.877 回答
1

在使用笔尖时,我也遇到过类似的情况来调整子视图的大小。不确定您是否是,但解决我的问题的是在我的各种视图中取消选中“使用自动布局”。

于 2012-12-03T16:18:39.183 回答
1

您不能复制图像并将其调整为正确的按钮大小吗?

在这篇文章中查看 IWasRobbed 的答案。

他在那里为您提供了一个很好的功能,并声称将这种方法用于他的按钮。

于 2012-12-05T14:50:36.690 回答
1

我遇到了同样的问题,但它发生在我的应用程序加载时,我弄乱button了检查器中的属性,如果你向下滚动并取消检查autoresize subviews它可能会起作用,它对我有用!

于 2012-11-29T04:06:02.073 回答