Iphone 在Xcode故事板中使用可拉伸图像

Iphone 在Xcode故事板中使用可拉伸图像,iphone,ios,xcode,cocoa-touch,uistoryboard,Iphone,Ios,Xcode,Cocoa Touch,Uistoryboard,我使用故事板来布局我的视图控制器,我想为我的按钮使用可拉伸图像(这样我就不需要生成多个不同大小的图像) 这是否可以直接在故事板中执行而不编写任何代码?我真的很喜欢将故事板用于所有的图形内容,并保持代码与UI内容的整洁,但似乎我在这里无法逃脱 如果不可能,您会提出其他建议吗?以下是我所做的: 我为按钮设置了一个插座并将其连接,然后在viewDidLoad中执行此操作: [self.someButton setBackgroundImage:[[self.someButton backgroundI

我使用故事板来布局我的视图控制器,我想为我的按钮使用可拉伸图像(这样我就不需要生成多个不同大小的图像)

这是否可以直接在故事板中执行而不编写任何代码?我真的很喜欢将故事板用于所有的图形内容,并保持代码与UI内容的整洁,但似乎我在这里无法逃脱

如果不可能,您会提出其他建议吗?

以下是我所做的: 我为按钮设置了一个插座并将其连接,然后在viewDidLoad中执行此操作:

[self.someButton setBackgroundImage:[[self.someButton backgroundImageForState:UIControlStateNormal] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 4, 3)] forState:UIControlStateNormal];
这使得它可以重用您在故事板中设置的图像,因此,如果您将其从一种颜色更改为另一种颜色,只要插图不更改,它就可以工作

为了一个有很多这些东西的观点,我做了以下几点:

for (UIView * subview in self.view.subviews) {
        if ([subview isKindOfClass:[UIImageView class]] && subview.tag == 10) {
            UIImageView* textFieldImageBackground = (UIImageView*)subview;
            textFieldImageBackground.image = [textFieldImageBackground.image stretchableImageWithLeftCapWidth:7 topCapHeight:5];
        } else if([subview isKindOfClass:[UIButton  class]] && subview.tag == 11) {
            UIButton * button = (UIButton*)subview;
            [button setBackgroundImage:[[button backgroundImageForState:UIControlStateNormal] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 4, 3)] forState:UIControlStateNormal];
        }
    }
请注意,我为所有想要拉伸的对象设置了标记


我和你一样,我希望能够在故事板上设置这些非常以用户界面为中心的东西。

iOS 7+的更新
iOS 7+现在支持通过资产目录以本机方式扩展图像。现在可以使用资源目录指定图像的切片方式和缩放方式(拉伸或平铺)。图像的这些资源目录属性将立即反映在情节提要中。新的巨大进步。有关详细信息,请参阅

用于部署到7之前的iOS版本:
这是一个鲜为人知的事实,但您完全可以仅使用界面生成器/情节提要和属性检查器中的拉伸属性来设置图像的cap插入。谢谢你的原始答案

查看
UIImage
的属性检查器中的拉伸属性,X和Y值是拉伸起点相对于图像的整个宽度和高度的位置。值0.5表示图像中间的一个点。

宽度和高度是相对于图像大小的可拉伸区域的大小。因此,将宽度设置为1/imageWidth将可拉伸区域设置为1px宽

大多数可拉伸图像都会从中间拉伸,因此使用这些X、Y、宽度和高度值通常会起作用:

X = 0.5
Y = 0.5
Width = 1/imageWidth
Height = 1/imageHeight
注意:除非拉伸的图像非常小,否则这意味着宽度和高度属性将非常小(例如0.008),可以使用0.0代替。所以,实际上,0.5,0.5,0.0,0.0几乎总是适用于X,Y,宽度和高度

在少数情况下,0.0不适用于宽度和高度,这确实意味着您需要使用计算器在IB中设置这些值。但是,我认为这通常比必须以编程方式进行设置更可取,因为您将能够在IB中看到结果拉伸图像(WYSIWYG)

更新:一些人指出,尽管使用上述建议在情节提要中拉伸图像是可行的,但即使在iOS7中,按钮上的拉伸图像仍然是无效的。不用担心,通过创建一个
ui按钮
类别可以轻松解决这一问题,该类别负责设置控制状态的cap插图:

@implementation UIButton (Stretchable)

/* Automatically set cap insets for the background image. This assumes that
   the image is a standard slice size with a 1 px stretchable interior */
- (void)setBackgroundImageStretchableForState:(UIControlState)controlState
{
    UIImage *image = [self backgroundImageForState:controlState];
    if (image)
    {
       CGFloat capWidth =  floorf(image.size.width / 2);
       CGFloat capHeight =  floorf(image.size.height / 2);
       UIImage *capImage = [image resizableImageWithCapInsets:
                     UIEdgeInsetsMake(capHeight, capWidth, capHeight, capWidth)];

       [self setBackgroundImage:capImage forState:controlState];
    }
}
使用此类别,您可以通过故事板设置按钮的可拉伸图像,然后通过在
-viewDidLoad
中调用
-setbackgroundimagestretcableforstate:
轻松确保按钮正确拉伸。通过视图层次结构进行迭代,即使对于视图中的大量按钮,也可以轻松完成此操作:

NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"self isKindOfClass:%@",[UIButton class]];
NSArray *buttons = [self.view.subviews filteredArrayUsingPredicate:predicate];
for (UIButton *button in buttons)
   [button setBackgroundImageStretchableForState:UIControlStateNormal];

虽然这不如拥有一个自动为您实现这一点的
UIButton
子类好(子类化
UIButton
不实用,因为它是一个类集群),它确实提供了几乎相同的功能,只需在viewDidLoad中添加一点样板代码——您可以在故事板中设置所有按钮图像,并且仍然可以使它们适当地拉伸。

这在XCode的5.0界面生成器和资产目录中是可行的。创建图像资源(如果您还没有资源目录,可以按如下方式创建一个:

  • 文件
    ->
    新建
    ->
    文件
    ->
    资源
    ->
    资产目录
  • 然后
    编辑器
    ->
    新图像集
  • 为每个
    习惯用法设置图像
    比例
  • 然后点击
    显示切片
    按钮,根据需要设置切片
  • 请在此处查看Apple文档: 然后,您所要做的就是将按钮的背景图像设置为请求的资源


    编辑:我忘了提到,它只在iOS7中按需要工作。使用Xcode切片功能指定图像可调整大小的中心区域的尺寸,并可以选择指定端盖,端盖是图像中不应由可调整大小的区域填充的区域。 请参见

    使用Xcode 6(和iOS7+target),您可以在使用图像资源时使用切片编辑器。 使用编辑器->显示切片菜单切换切片模式,或在使用编辑器选择特定图像时按显示切片按钮(如下所示)

    然后,您可以为特定的显示比例选择图像并拖动规则或手动编辑插入值

    之后,您可以在Interface Builder中选择此图像。例如,我将其用于UIButton背景图像(IB按钮的表示可能看起来不好,但在运行时应该可以)

    我的按钮看起来不错(运行iOS 7.1模拟器和iOS 8设备)


    这个苹果文档可能会有帮助。

    是的,最后做了基本相同的事情。谢谢你。你能为按钮的背景图像设置这个吗?但是,我在故事板的哪个面板中找不到这样的UIImage检查。它在属性检查器的底部。这个解决方案的最大问题是你不能为UIB做这个乌顿的背景图像