【问题标题】:Access the UIImageView of the background image of a UIButton访问 UIButton 的背景图片的 UIImageView
【发布时间】:2016-07-04 23:05:39
【问题描述】:

我有一个 UIButton,我想访问其背景图像的 UIImageView,以便我可以使图像成为圆形。我知道我可以影响图像本身,但我更愿意更优雅地做到这一点。我也知道我可以使用button.currentBackgroundImage 属性在后台获取 UIImage,但我想要视图本身。获得视图后,我打算使用此代码:

buttonImageView.layer.cornerRadius = buttonImageView.frame.size.width / 2;
buttonImageView.clipsToBounds = YES;

如何访问 buttonImageView?

编辑: 由于@vhristoskov 的建议,我尝试使用以下代码裁剪按钮本身:

self.button.layer.cornerRadius = self.button.frame.size.width/2;
self.button.clipsToBounds = YES;

它做成了这个形状:

调试后发现frame.size.width是46,本来应该是100。所以我改用这段代码:

self.button.layer.cornerRadius = self.button.currentBackgroundImage.size.width/2;
self.button.clipsToBounds = YES;

产生了这个形状:

这一次,cornerRadius 被设置为 65。所以实际上我的问题似乎是我目前没有正确的宽度。我应该访问哪个属性以获得正确的数字?

【问题讨论】:

  • 是否有理由不将相同的代码直接应用于您的 UIButton?
  • @vhristoskov 嗯,我刚试过,结果很奇怪,图像的形状很奇怪。如果你愿意,我可以添加我的问题发生的屏幕截图。
  • 这会很棒。您还可以在 IB 中添加约束图像(或用于设置按钮框架的代码)。
  • @vhristoskov 如果您有任何想法,我添加了图片
  • 请在下面查看我的回答,希望这对您有所帮助并结束这个谜团:D

标签: ios objective-c uiimageview uibutton


【解决方案1】:

正如我猜想和您已经发现的那样 - 问题出在按钮大小上。为确保您的按钮在运行时的大小符合您的预期 - 检查您的约束。在下面的示例中,按钮具有垂直和水平居中对齐以及固定的宽度和高度。

约束:

要拥有完美的圆形按钮,您应该拥有button.width == button.height。如果满足此条件,您的代码应该像魅力一样工作:

self.button.layer.cornerRadius = CGRectGetWidth(self.button.frame) / 2;
self.button.clipsToBounds = YES;

【讨论】:

  • 原来我的问题是试图在 viewDidLoad 处获取按钮宽度,显然该宽度仅在 viewDidAppear 处有效。无论如何,我都会接受这个答案,因为它包含了我的解决方案的要点。感谢所有帮助:)
【解决方案2】:

假设你调用了类似的东西:

[self.myButton setBackgroundImage:[UIImage imageNamed:@"image"] forState:UIControlStateNormal];

在 viewDidLoad 或更早之前,您可以在 viewDidAppear 中调用以下内容:

if (self.myButton.subviews.count > 0 && [self.myButton.subviews[0] isKindOfClass:[UIImageView class]]) {
    UIImageView *imageView = self.myButton.subviews[0];
    imageView.layer.cornerRadius = imageView.frame.size.width / 2;
    imageView.clipsToBounds = YES;
}

但它并不优雅,因为子视图排序是 UIButton 的一个实现细节,并且可能随时更改。

【讨论】:

  • 看起来 UIButton 实际上没有任何子视图:/
  • 我发现子视图只是由 viewDidAppear 添加的,但在 viewDidLoad 时还没有出现。这可能取决于第一次设置背景图像的时间。
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多