如何防止按钮的背景图像拉伸?

Rap*_*eta 52 cocoa-touch uibutton uikit uiimageview ios

我正在为UIView分配一个UIButtonTypeCustom UIButton,其背景图像小于按钮的框架.图像较小的原因是因为我试图为UIButton添加更多的"目标区域".但是,图像被缩放到帧的完整大小,而不仅仅是图像的大小.

我已经尝试将UIButton和UIButton的imageView contentMode属性设置为"UIViewContentModeScaleAspectFit",但没有运气,图像仍然被拉伸.

有没有办法做我想以编程方式做的事情?

提前致谢!

mem*_*ons 124

很多人在按钮图像方面犯了同样的错误,然后跳过箍,试图使按钮按照他们的预期运行.让我们一劳永逸地清楚这一点:

A UIButton可以显示两种类型的图像 - 前景图像和背景图像.预期按钮的背景图像将替换按钮的背景纹理.因此,有意义的是它伸展以填满整个背景.但是,按钮的前景图像应该是可以显示或不显示在文本旁边的图标; 它不会伸展.如果框架小于图像,它可能会缩小,但它不会拉伸.您甚至可以使用Interface Builder中的Control对齐属性设置前景图像的对齐方式.

可以在代码中设置按钮的前景和背景图像,如下所示:

// stretchy
[self setBackgroundImage:backgroundImage forState:UIControlStateNormal];  

// not stretchy
[self setImage:forgroundImage forState:UIControlStateNormal]; 
Run Code Online (Sandbox Code Playgroud)

  • 当您需要在其上方显示带有文本的非拉伸图像时,您会怎么做? (52认同)
  • 我目前正在我的应用程序集中看到一个图像,其中'setImage()'被拉伸以填充按钮.我不知道这个答案的内容是否已经不再适用,或者是否有我不知道的事情.我倾向于假设后者,但我认为值得一提. (3认同)

Zol*_*tók 8

您无权访问后台imageView,但有完全可行的解决方法:

编辑:有一个更好的解决方法,然后我最初发布.您可以从任何颜色创建UIImage,然后调用-setBackgroundImage:forState.

请参阅bradley's答案:https: //stackoverflow.com/a/20303841/1147286


原始答案:

而不是调用-setBackgroundImage:forState:,创建一个新的UIImageView并将其添加为按钮的子视图.

UIImageView *bgImageView = [[UIImageView alloc] initWithImage:img];
bgImageView.contentMode = UIViewContentModeScaleAspectFit;
[bgImageView setFrame:CGRectMake(0, 0, videoButton.frame.size.width, videoButton.frame.size.height)];
bgImageView.tag = 99;
[yourButton addSubview:bgImageView];
[yourButton bringSubviewToFront:yourButton.imageView];
Run Code Online (Sandbox Code Playgroud)
  1. 创建imageview
  2. 设置内容模式和框架
  3. 我还设置了一个可识别的标签,这样当屏幕旋转时,我可以轻松地在按钮的子视图中找到我的自定义imageView并重置其框架
  4. 将其作为子视图添加到按钮
  5. 将按钮的正面imageView放在前面,这样我们的自定义imageView就不会重叠它

当按钮需要旋转时,只需通过其标签找到imageView并重置其框架:

UIImageView *bgImageView = (UIImageView *)[button viewWithTag:99];
[bgImageView setFrame:CGRectMake(0, 0, newWidth, newHeight)];
Run Code Online (Sandbox Code Playgroud)


ozb*_*zba -1

您需要做的是将图像添加为 UIImageView。

然后在其顶部添加一个具有透明背景(UIColor ClearColor)的按钮,并具有所需的宽度和高度。