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