iOS自定义键盘中可拉伸的图片停止拉伸

4
我为一个UITextField制作了一个自定义键盘,它由18个UIButtons组成。它是一个UIView,设置为文本字段的inputView。
这些按钮是在UIView的initWithFrame:方法中使用以下代码创建的。
UIImage* buttonImage =[[UIImage imageNamed:@"keyboard-button-background.png"] stretchableImageWithLeftCapWidth:1.0 topCapHeight:79.0];
UIImage* buttonPressedImage =[[UIImage imageNamed:@"keyboard-button-pressed-background.png"] stretchableImageWithLeftCapWidth:1.0 topCapHeight:79.0];

UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:title forState:UIControlStateNormal];
[button setBackgroundImage:buttonImage forState:UIControlStateNormal];
[button setBackgroundImage:buttonPressedImage forState:UIControlStateHighlighted];

button.frame = CGRectMake(xPosition, yPosition, buttonWidth, buttonHeight);

一旦按钮被按下,该按钮就会被设置为enabled = NO。只要其中一个按钮被启用,背景就可以完美地伸展。如果所有的按钮都被禁用,并且UITextfield resignsFirstResponder并重新成为第一个响应者,按钮会出现,但是背景图像不再伸展(至少在垂直方向上不伸展,水平方向看起来还好)。
我真的不知道从哪里开始寻找解决方案。我的猜测是自定义键盘绘制子视图的方式不对,但我不确定。
这是否可以通过在layoutSubviewsdrawRect:中设置背景图像来解决?水平拉伸正常工作的事实让我想知道UIButton的框架是否正确地绘制了。
编辑: 最左边的单元格只是标签,右边带有数字的单元格是UITextfields,具有自定义键盘
如何查看键盘: How the keyboard should look 一旦第三个单元格放弃第一个响应者,然后将1设为第一个响应者(所有键都禁用),然后将4设为第一个响应者后,键盘实际上看起来如何: How the keyboard actually looks once resigned first responder on cell 3, then gave 1 first responder (all keys disabled), then gave 4 first responder

你能包含一些截图吗?有点难以想象这应该是什么样子的。 - jrturton
你在哪里设置你的矩形? - Luke
我已经添加了这行代码,我在 initWithFrame: 中设置了按钮的框架。 - Josh
2个回答

2
为了处理不同的iOS API,我为UIImage创建了一个分类。
@implementation UIImage (SPResizableImage)

- (UIImage *)spResizableImageWithCapInsets:(UIEdgeInsets)edge
{
    UIImage * resizableImage = nil;

    if ([self respondsToSelector:@selector(resizableImageWithCapInsets:)]) // iOS 5
    {
        resizableImage = [self resizableImageWithCapInsets:edge];
    }
    else
    {
        resizableImage = [self stretchableImageWithLeftCapWidth:edge.left
                                                   topCapHeight:edge.top];
    }

    return resizableImage;
}

@end

好像可以工作了!有些奇怪的是,stretchableImageWithLeftCapWidth:topCapHeight:在某些情况下并不完全有效,但是没关系!感谢您的帮助。 - Josh

0

你使用的背景图片尺寸是多少?

无论如何,自iOS 5以来stretchableImageWithLeftCapWidth:topCapHeight:已经被弃用。 请尝试使用resizableImageWithCapInsets:代替。


图像尺寸为 9 x 80,此特定键盘上的按钮为 53 x 65。我有几个不同的键盘布局,但它们都使用相同的图像。有趣的是,水平拉伸起作用,但垂直似乎无效。 - Josh
哦,我必须支持iOS 4,所以如果可能的话,我需要使用stretchableImage... - Josh
我认为问题在于顶部帽值。我曾经遇到过图像拉伸的类似问题。 - DrAL3X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接