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的主要内容,如果未能解决你的问题,请参考以下文章