Interface Builder(iPhone dev)自定义按钮背景图像不尊重拉伸设置

时间:2010-01-03 23:59:18

标签: iphone xcode uikit interface-builder uibutton

我正在尝试使用Interface Builder中的背景图像创建自定义按钮。该图像具有可伸缩和不可拉伸的部分,因此可以调整大小。

IB公开Stretching属性以允许这样做,但是我输入的值没有影响按钮的显示方式。它总是被完全拉伸以填充框架的大小。

这可能是IB或UIButton中不支持的功能吗?

http://img.skitch.com/20100103-rjabkq2c2jkqynw47crxepdtwb.jpg

(注意:上面的拉伸值不适合图像正常使用,但只是我在屏幕截图时弄乱的值)

5 个答案:

答案 0 :(得分:2)

开始iPhone 3开发的示例中,仅使用 UIImage leftCapWidth topCapHeight ,并以编程方式创建/设置图像,如果contentStretch不起作用,那么这是另一种方法。

答案 1 :(得分:0)

如果您希望拉伸多个像素(即按钮中心的图案),则可伸缩的UIImage不起作用。

UIButton的contentStretch也无法正常工作。

我是如何解决的:我将UIButton子类化并添加了UIImageView *backgroundImageView作为属性,并将其作为UIButton内的子视图放在索引0处。然后我在layoutSubviews中确保它完全适合按钮并设置imageView的突出显示状态。您需要做的就是使用正确的contentStretch和contentMode切换UIImageView。

.h文件

@interface ButtonWithBackgroundImage : UIButton {
    UIImageView *backgroundImageView;
}
@property (retain) UIImageView *backgroundImageView;
+ (ButtonWithBackgroundImage*)button;
@end

.m文件

@implementation ButtonWithBackgroundImage
@synthesize backgroundImageView;

+ (ButtonWithBackgroundImage*)button {
return [self buttonWithType:UIButtonTypeCustom];
}
- (void)setBackgroundImageView:(UIImageView*)img {
    [backgroundImageView removeFromSuperview];
    [backgroundImageView release];

    backgroundImageView = [img retain];

    if(backgroundImageView){
        [self insertSubview:backgroundImageView atIndex:0];
        [self setNeedsLayout];
    }
}

- (void)setSelected:(BOOL)select {
    [super setSelected:select];
    // we subclass the setSelect method to highlight the background imageview
[backgroundImageView setHighlighted:select||self.highlighted];
}
- (void)setHighlighted:(BOOL)highl {
    [super setHighlighted:highl];

    // we subclass the setHighlighted method to highlight the background imageview    
    [backgroundImageView setHighlighted:highl||self.selected];
}

- (void)layoutSubviews {
    [super layoutSubviews];

    self.backgroundImageView.frame = self.bounds;
}

- (void)dealloc {
    [backgroundImageView release];
    backgroundImageView = nil;
    [super dealloc];
}
@end

答案 2 :(得分:0)

按钮的背景图像将始终调整大小以填充框架;前景图像不会调整大小(如果没有文本,则居中)。伸展的逻辑是它调整中间的大小,同时保持边界完整;例如,对于圆角矩形,这意味着圆角不会扭曲。

答案 3 :(得分:0)

使用Xcode切片功能指定图像可调整大小的中心区域的尺寸,并可选择指定端盖,这是图像中不应由可调整大小区域填充的区域。 见About Asset Catalogs

答案 4 :(得分:-1)

我有它的工作!对我来说,神奇的价值是0.2和0.2。

我的图片是一个盒子内的盒子,都有圆角。

当它为0.2和0.8时,它会使图像顶部未拉伸,但底部会拉伸并扭曲。

我猜,第一个0.2是偏移意味着多少不伸展,第二个可能是拉伸多少。至少,0.2和0.6也有效。

原则上,您可以进行实验:拍摄格子或同心圆或颜色渐变的图像并拉伸它。如果你这样做,请发布图片:)。