4

我为 UITextField 制作了一个自定义键盘,由 18 个 UIButtons 组成。它是一个 UIView,它被设置为文本字段的 inputView。

按钮是在initWithFrame:UIView 的方法中使用代码创建的

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。至少启用一个按钮时,背景会完美拉伸。如果所有按钮都被禁用,并且 UITextfieldresignsFirstResponder然后 UITextField 再次成为 First Responder,则按钮会出现,但背景图像似乎不再拉伸(至少不是垂直方向,水平方向似乎很好)。

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

这可以通过设置背景图像或类似的东西来解决layoutSubviewsdrawRect:?水平拉伸效果很好的事实让我想知道 UIButton 的框架是否在绘制时不正确。

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

键盘的外观: 键盘的外观

一旦在单元格 3 上辞职了第一响应者,然后给了 1 个第一响应者(所有键被禁用),然后给了 4 个第一响应者,键盘的实际外观如何: 一旦在单元格 3 上辞职了第一响应者,然后给了 1 个第一响应者(所有键都被禁用),然后给了 4 个第一响应者,键盘的实际外观如何

4

2 回答 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
于 2012-11-23T13:41:41.223 回答
0

您使用的背景图像的大小是多少?

无论如何stretchableImageWithLeftCapWidth:topCapHeight:,自 iOS 5 以来已弃用。尝试resizableImageWithCapInsets:改用。

于 2012-11-23T09:45:42.760 回答