背景UIButton图像错误地缩放

时间:2012-11-29 01:18:21

标签: iphone objective-c ios xcode storyboard

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

点击之前:

enter image description here

点击后:

enter image description here

让事情发生的代码:

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) {
    }];

8 个答案:

答案 0 :(得分: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];

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

答案 1 :(得分:2)

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

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

然而,这会使您的照片位于按钮的左侧。我建议的解决方案是使用2张图片:

  1. 仅包含按钮边框的可调整大小的图片,设置为按钮的背景图片
  2. 仅包含头部的图像,设置为具有恒定大小的按钮图像
  3. 代码看起来像:

    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];

    希望这有帮助!

答案 2 :(得分: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) {
                 }];

答案 3 :(得分:2)

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

使其使用自动布局的关键是为widthConstraint常量值设置动画,并在动画中设置背景图像。

例如,我的视图名称按钮上有一个按钮,我有一个名为 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时设置框架对我来说不起作用,所以我给约束常量设置了动画

答案 4 :(得分:2)

尝试此操作,而不是将图像指定为

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

这样做

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

无需设置resizableImageWithCapInsets的约束。

答案 5 :(得分:1)

我遇到了同样的问题,但是当我的应用加载时发生了这种情况,我在检查器中查看了button的属性,如果向下滚动并取消选中autoresize subviews它可能会工作,它为我做了!祝你好运!

答案 6 :(得分:1)

在使用笔尖时,我有类似的情况调整子视图的大小。不确定你是不是,但解决我的问题的是在我的各种观点中取消选中“使用Autolayout”。

希望能解决您的问题。

布兰登

答案 7 :(得分:1)

您是否可以复制图像并将其调整为正确的按钮大小?

在此post.

中查看IWasRobbed的答案

他有一个很好的功能,并声称他的按钮使用这种方法。