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

Posted

技术标签:

【中文标题】iOS 自定义键盘可拉伸图像停止拉伸【英文标题】:iOS custom keyboard stretchable image stops stretching 【发布时间】:2012-11-15 11:39:27 【问题描述】:

我为 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 并有自定义键盘

键盘的外观:

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

【问题讨论】:

你能附上一些截图吗?很难想象这应该是什么样子。 你在哪里设置你的矩形? 我已经添加了行,我在initWithFrame:中设置了按钮的框架 【参考方案1】:

为了处理不同的 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: 在某些情况下不能正常工作,但我们开始了!感谢您的帮助。【参考方案2】:

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

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

【讨论】:

图像大小为9 x 80,此特定键盘上的按钮为53 x 65。我有几种不同的键盘布局,但它们使用相同的图像。有趣的是,水平拉伸有效,但垂直似乎不起作用。 哦,我必须支持 iOS 4,所以如果可能的话,我需要使用 stretchableImage... 我认为问题出在顶值上。我在拉伸图像时遇到了类似的问题。

以上是关于iOS 自定义键盘可拉伸图像停止拉伸的主要内容,如果未能解决你的问题,请参考以下文章

如何制作可拉伸的自定义 UITablecell

非视网膜显示屏上的自定义导航按钮失真(使用可拉伸图像方法)

如何阻止我的自定义 UITableViewCell backgroundImage 可拉伸?

自定义滑块轨道图像

iOS 自定义键盘自动布局

iOS6 中的 UISlider 自定义问题