UIButton 子类自动应用了 cap insets

Posted

技术标签:

【中文标题】UIButton 子类自动应用了 cap insets【英文标题】:UIButton subclass with cap insets automatically applied 【发布时间】:2013-04-12 15:28:45 【问题描述】:

好吧,我以为我有一个绝妙的主意。带有 cap insets 的 UIButton 自动应用于背景图像。

@implementation JLTCapInsetButton

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

    CGFloat leftRight = (image.size.width - 1) / 2;
    CGFloat topBottom = (image.size.height - 1) / 2;
    UIEdgeInsets insets = UIEdgeInsetsMake(topBottom, leftRight, topBottom, leftRight);
    UIImage *capInsetImage = [image resizableImageWithCapInsets:insets];

    [super setBackgroundImage:capInsetImage forState:state];


@end

这不起作用,因为 IB 不使用-setBackgroundImage:forState:。我的解决方法是使用-awakeFromNib

- (void)awakeFromNib

    [self JLT_fixBackgroundImageForState:UIControlStateNormal];
    [self JLT_fixBackgroundImageForState:UIControlStateHighlighted];
    [self JLT_fixBackgroundImageForState:UIControlStateDisabled];
    [self JLT_fixBackgroundImageForState:UIControlStateSelected];
    [self JLT_fixBackgroundImageForState:UIControlStateSelected | UIControlStateHighlighted];
    [self JLT_fixBackgroundImageForState:UIControlStateSelected | UIControlStateDisabled];


- (void)JLT_fixBackgroundImageForState:(UIControlState)state

    UIImage *backgroundImage = [self backgroundImageForState:state];

    if (backgroundImage)
        [self setBackgroundImage:backgroundImage forState:state];

这不起作用,因为如果为UIControlStateNormal 设置了图像,[self backgroundImageForState:state] 总是返回一个值。

解码时是否有一种干净的方法来挂钩背景图像的设置?有没有一种干净的方法来检测一个状态是否有背景图像,而不仅仅是来自基本状态的隐含图像?

【问题讨论】:

【参考方案1】:

在修复之前保留对已应用于 UIControlStateNormal 的图像的引用如何?对于后续的控制状态,只需在应用修复之前检查图像是否相同,如果是,请跳过修复该状态的图像...

【讨论】:

我终于回到了这个话题。我测试了你的建议,它奏效了。耶! 酷,很高兴它有帮助!感谢您回复我:)

以上是关于UIButton 子类自动应用了 cap insets的主要内容,如果未能解决你的问题,请参考以下文章

UIButton子类在故事板中崩溃[重复]

Ios UIButton 与 OpenGL 的子类化

子类 UIButton 似乎没有初始化

UIButton 子类不响应超级方法?

UIButton 子类中的 imageview.transform 奇怪的行为

根据子类中的 UIButton 大小设置cornerRadius 的最佳位置?