iOS自定义键盘可伸缩图像停止拉伸

我为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);

按下按钮后,该按钮将设置为启用=否.当至少启用其中一个按钮时,背景会完美展开.如果所有按钮都被禁用,并且UITextfield resignFirstResponder然后UITextField再次成为First Responder,则会出现按钮,但背景图像似乎不再拉伸(至少不在垂直方向,水平似乎很好).

我不确定从哪里开始寻找解决方案.我的猜测是自定义键盘绘制子视图的方式,但我不确定.

可以通过在layoutSubviews或drawRect:或类似的东西中设置背景图像来解决这个问题吗?水平拉伸工作正常的事实让我想知道UIButton的框架是否正确,因为它正在绘制.

编辑
最左边的单元格只是标签,右边的单元格是UITextfields并且有自定义键盘

键盘的外观如何:

键盘实际看起来如何在单元格3上重新响应第一响应者,然后给出1个第一响应者(禁用所有键),然后给出4个第一响应者:

最佳答案 为了处理不同的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
点赞