【问题标题】:Stretch background image for UIButton为 UIButton 拉伸背景图像
【发布时间】:2012-09-19 09:23:29
【问题描述】:

我得到了比我的 UIButton 更短的纹理。

我得到了这个纹理:

我应该创建这个按钮:

我应该如何拉伸(不是平铺)这种纹理?横向拉伸

谢谢

【问题讨论】:

    标签: ios uibutton uiimage textures


    【解决方案1】:

    根据您提供的示例图片,我很确定您正在寻找 UIImageresizableImageWithCapInsets:

    UIImage *originalImage = [UIImage imageNamed:@"myImage.png"];
    UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);
    UIImage *stretchableImage = [originalImage resizableImageWithCapInsets:insets];
    [myButton setBackgroundImage:stretchableImage forState:UIControlStateNormal];
    // the image will be stretched to fill the button, if you resize it.
    

    UIEdgeInsets 结构中的值决定了您不想被拉伸的边距。你的左值和右值可能大约是这个宽度:

    顶部和底部的值可以是 0(如果您不想垂直调整按钮的大小),也可以是总高度的一半。

    【讨论】:

    • resizableImageWithCapInsets 在 iOS 5.0 及更高版本中可用。你知道 iOS 4.3 的一些东西吗?
    • 可能不是您想要的答案,但我看到的最后一个估计是所有 iPhone 中有 90% 至少运行 iOS 5.0。 iOS6 在 8 天后已经有 30% 的渗透率。只是说,你可能会考虑改变你的目标,而不是试图将解决方案硬塞到 4.3 中。
    • @drummerb 你应该使用setBackgroundImage:forState 而不是setImage:forState
    • 这是我写的一个小工具,可能会有所帮助:cocoacontrols.com/controls/thecapper
    • 这造成了一些我见过的最奇怪的行为。
    【解决方案2】:

    借助 Xcode 6(和 iOS7+ 目标),您可以在处理图像资源时使用切片编辑器。 使用 Editor -> Show Slicing 菜单切换切片模式或在使用编辑器选择特定图像时按 Show Slicing 按钮(如下所示)。

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

    之后,您可以在 Interface Builder 中为 UIButton Background Image 选择此图像(IB 按钮的表示可能看起来很糟糕,但应该是运行时OK)。

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

    此 Apple 文档 link 可能会有所帮助。

    【讨论】:

    • 只是好奇,即使切片后你仍然需要设置 UIButton 的内容插入,对吗?
    • @DanielGalasko 无需设置内容插图。对我来说,切片就可以了。
    • 不要被界面生成器所迷惑!它适用于正在运行的应用程序。
    【解决方案3】:

    如果不平铺,我假设你不能使用

    - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
    

    做你想做的事的方法就是使用:

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0); // should be proportionally larger
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, (CGRect){{0,0}, newSize}, [yourImage CGImage]);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
    

    【讨论】:

    • 好吧,在我回复之后,你有点改变了你的问题,所以@DrummerB 提供了我应该给你的答案,但是他给了你一个非常好的关于如何定义大写的图像!我刚刚给他+1,主要是因为图片向您展示了如何做到这一点!
    【解决方案4】:

    使用stretchableImageWithLeftCapWidth:topCapHeight: 方法。

    参考:https://github.com/boctor/idev-recipes/tree/master/StretchableImages

    【讨论】:

    • resizableImageWithCapInsets: 已弃用
    【解决方案5】:

    或使用可拉伸图像

    UIImage* imgbkg =[[UIImage imageNamed: @"my_bkg_image.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:10];
    
    [_button setBackgroundImage: imgbkg forState: UIControlStateNormal];
    

    如果您不想拉伸某一侧,请使用 0

    【讨论】:

    • resizableImageWithCapInsets: 已弃用
    • @Cœur 它真的被弃用了吗?我总是使用它,因为它更简单。
    • 自 iOS5 起已弃用。但是如果你仍然支持iOS4,即使iOS9仍然支持旧的方式。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2011-11-12
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多