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

时间:2012-11-15 11:39:27

标签: ios uibutton uiimage uikeyboard

我为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然后UITextField再次成为First Responder,则会出现按钮,但背景图像似乎不再拉伸(至少不在垂直方向,水平似乎很好)。

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

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

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

键盘的外观如何: How the keyboard should look

键盘实际看起来如何在单元格3上重新响应第一响应者,然后给出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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您正在使用的背景图片的大小是多少?

无论如何,{iOS从iOS 5开始stretchableImageWithLeftCapWidth:topCapHeight:被删除了。 请尝试使用resizableImageWithCapInsets: