如何使用UIView的contentStretch

时间:2011-03-30 00:59:07

标签: iphone uikit

我想使用大小为27x27的图像,中心1像素可伸缩作为UIButton的backgroundImage。这是我的代码:

[button setBackgroundImage:[UIImage imageNamed:@"button_image"] forState:UIControlStateNormal];
button.frame = CGRectMake(0.f, 0.f, 27.f, 27.f);
button.contentStretch = CGRectMake(13.f/27.f, 13.f/27.f, 1.f/27.f, 1.f/27.f);
[button setTitle:NSLocalizedString(@"long title", @"long title") forState:UIControlStateNormal];
[button sizeToFit];
CGRect buttonFrame = button.frame;
buttonFrame.size.width += 18.f * 2;
button.frame = buttonFrame;

但结果与没有设置contentStretch的结果没什么不同。

那么如何正确使用contentStretch来实现我想要的呢?

请不要一次又一次地告诉我,我可以用stretchableImageWithLeftCapWidth:topCapHeight:达到同样的效果。我知道,这显然不是我要求的。我只是想知道如何正确使用contentStretch。感谢。

4 个答案:

答案 0 :(得分:1)

我看到的一个问题是你使用整数除法进行划分。 1/2/等于0. 1.0 / 27.0等于0.037 ...

如果您想要的只是按钮上的可伸缩背景,请查看在UIImage上的stretchableImageWithLeftCapWidth:topCapHeight :.以这种方式创建可伸缩图像,然后将其设置为按钮的背景。

答案 1 :(得分:1)

我不知道UIButtons的特殊行为(我还建议在那里使用stretchableImages,因为它是复合视图)。但是,如果你想使用contentStretch你可以在UIView上这样做,因为你的数据是:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)];
view.layer.contents = (id)[[UIImage imageNamed:@"button_image"] CGImage];
view.contentStretch = CGRectMake(13./27., 13./27., 1./27., 1./27.);

这应该足以让UIView具有可伸缩的背景。

答案 2 :(得分:1)

使用-[UIImage stretchableImageWithLeftCapWidth:topCapHeight:]

我把它放在init的子类UIView方法中:

// Add errorBackground & errorLabel.
rect.size.height = 26.0f;
errorBackground = [[UIImageView alloc] initWithFrame:rect];
errorBackground.image = [[UIImage imageNamed:@"ErrorBubble.png"]
                         stretchableImageWithLeftCapWidth:13 topCapHeight:0];
UILabel *errorLabel = [[UILabel alloc] initWithFrame:
                       CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height)];
errorLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
errorLabel.backgroundColor = [UIColor clearColor];
errorLabel.textAlignment = UITextAlignmentCenter;
errorLabel.font = [UIFont systemFontOfSize:14.0f];
errorLabel.text = @"1 Failed Passcode Attempt";
errorLabel.textColor = [UIColor whiteColor];
errorLabel.shadowColor = [UIColor blackColor];
errorLabel.shadowOffset = CGSizeMake(0.0f, -1.0f);
[errorBackground addSubview:errorLabel];
[errorLabel release];
[self addSubview:errorBackground];

ErrorBubble.png: ErrorBubble.png

ErrorBubble@2x.png: ErrorBubble@2x.png

答案 3 :(得分:1)

不满意但简单的答案:

你不能,直到Apple修复此问题。 IMO这是一个长期存在且非常讨厌的bug。

UIButton实现包含几个子视图,(内部)背景视图似乎不反映在UIButton视图上完成的设置。