在 swift for iOS 中以编程方式设置图像的拉伸参数

2024-05-01

因此,如果我们只想拉伸图像的一部分,无论是常规图像还是背景图像,我们在布局编辑器中使用以下设置:

您如何以编程方式设置这些?

我正在使用 Xcode 7.2.1


指定图像的上限插图

您可以通过使用来设置拉伸细节UIImage method .resizableImageWithCapInsets(_:UIEdgeInsets, resizingMode: UIImageResizingMode).

宣言

func resizableImageWithCapInsets(capInsets: UIEdgeInsets, resizingMode: UIImageResizingMode) -> UIImage

描述

创建并返回具有指定上限插图的新图像对象 和选项。

具有指定上限插图和调整大小模式的新图像对象。

参数

capInsets:用于上限插入的值。

resizingMode:图像内部的模式 调整大小。


示例:使用指定的帽插入进行自定义拉伸

举个例子,让我们尝试以编程方式沿其宽度拉伸我的(当前)个人资料图片,恰好在我的右腿(从观看角度来看左侧),并将图像的其余部分保留为原始图像比例。这类似于将某些按钮纹理的宽度拉伸到其内容的大小。

首先,让我们加载原始图像foo.png as an UIImage object:

let foo = UIImage(named: "foo.png") // 328 x 328

现在,使用.resizableImageWithCapInsets(_:UIEdgeInsets, resizingMode: UIImageResizingMode),我们将定义另一个UIImage例如,使用指定的上限插入(到我的右腿中间),并将调整大小模式设置为.Stretch:

/* middle of right leg at ~ |-> 0.48: LEG :0.52 <-| along 
   image width (for width normalized to 1.0)                */
let fooWidth = foo?.size.width ?? 0
let leftCapInset = 0.48*fooWidth
let rightCapInset = fooWidth-leftCapInset // = 0.52*fooWidth

let bar = UIEdgeInsets(top: 0, left: leftCapInset, bottom: 0, right: rightCapInset)
let fooWithInsets = foo?.resizableImageWithCapInsets(bar, resizingMode: .Stretch) ?? UIImage()

注意0.48上面的文字对应于您输入的值X在界面生成器中,如上面问题中的图片所示(或如所描述的详细信息请参阅 Matt 提供的链接 http://macoscope.com/blog/stretchable-images-using-interface-builder/).

继续,我们最终将带有帽子插图的图像放置在UIImageView,并让该图像视图的宽度大于图像的宽度

/* put 'fooWithInsets' in an imageView.
   as per default, frame will cover 'foo.png' size */
let imageView = UIImageView(image: fooWithInsets)

/* expand frame width, 328 -> 600 */
imageView.frame = CGRect(x: 0, y: 0, width: 600, height: 328)

生成的视图按指定拉伸原始图像,产生不成比例的长腿。

现在,只要图像的框架有1:1 width:height比例(328:328),拉伸将是均匀的,就好像只将任何图像适合更小/更大的框架。对于任何具有width值大于height (a:1, 比率,a>1),腿部将开始不成比例地伸展。


扩展以匹配X, width, Y and heightInterface Builder 中的拉伸属性

最后,为了彻底地实际回答你的问题(我们实际上只是在上面隐式地完成了这个问题),我们可以利用X, width, Y and heightInterface Builder 中的拉伸属性马特提供的链接 http://macoscope.com/blog/stretchable-images-using-interface-builder/,构建我们自己的UIImage扩展使用(显然)相同的属性,转换为扩展中的上限插入:

extension UIImage {
    func resizableImageWithStretchingProperties(
    X X: CGFloat, width widthProportion: CGFloat,
    Y: CGFloat, height heightProportion: CGFloat) -> UIImage {

        let selfWidth = self.size.width
        let selfHeight = self.size.height

        // insets along width
        let leftCapInset = X*selfWidth*(1-widthProportion)
        let rightCapInset = (1-X)*selfWidth*(1-widthProportion)

        // insets along height
        let topCapInset = Y*selfHeight*(1-heightProportion)
        let bottomCapInset = (1-Y)*selfHeight*(1-heightProportion)

        return self.resizableImageWithCapInsets(
            UIEdgeInsets(top: topCapInset, left: leftCapInset,
                bottom: bottomCapInset, right: rightCapInset),
            resizingMode: .Stretch)
    }
}

使用这个扩展,我们可以实现相同的水平拉伸foo.png如上所述,如下:

let foo = UIImage(named: "foo.png") // 328 x 328
let fooWithInsets = foo?.resizableImageWithStretchingProperties(
    X: 0.48, width: 0, Y: 0, height: 0) ?? UIImage()

let imageView = UIImageView(image: fooWithInsets)
imageView.frame = CGRect(x: 0, y: 0, width: 600, height: 328)

扩展我们的示例:拉伸宽度和高度

现在,假设我们要像上面那样拉伸我的右腿(沿着宽度),但除此之外还要沿着图像的高度拉伸我的手和左腿。我们通过使用来控制这个Y上面扩展中的属性:

let foo = UIImage(named: "foo.png") // 328 x 328
let fooWithInsets = foo?.resizableImageWithStretchingProperties(
    X: 0.48, width: 0, Y: 0.45, height: 0) ?? UIImage()

let imageView = UIImageView(image: fooWithInsets)
imageView.frame = CGRect(x: 0, y: 0, width: 500, height: 500)

产生以下拉伸图像:


该扩展显然允许更通用地使用 cap 插入拉伸(与使用 Interface Builder 的多功能性相当),但请注意,当前形式的扩展不包括任何用户输入验证,因此由调用者决定在正确的范围内使用参数。

最后,关于任何涉及图像及其操作的相关注释坐标:

Note:图像坐标轴x(宽度)和y(高度)运行为

x (width):  left to right (as expected)
y (height): top to bottom (don't miss this!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 swift for iOS 中以编程方式设置图像的拉伸参数 的相关文章

  • ActionScript、NetStream.Play.Failed iOS AIR 移动设备

    我正在尝试以类似于 Tiberiu Ionu Stan http stackoverflow com questions 2036107 aac mp4 not working in actionscript 3s netstream 的方
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • iPhone,如何隐藏标签栏按钮?

    如何隐藏单个标签栏按钮 我已经搜索过 但什么也没找到 只找到了完整的栏 我已经取得了一些进展 但仍然遇到问题 此代码位于我的应用程序委托中 带有选项卡栏的出口 我在其中调用它viewDidLoad选项卡栏中显示的第一个视图的视图 void
  • Obj-C / Swift 项目中的致命陷阱异常

    我开始将 Swift 代码集成到我的 Obj C 项目中 一切都进展顺利 但今天 当我更新到 Xcode 6 1 时 事情变得很糟糕 我从之前运行良好的 Swift 代码中收到了许多 陷阱 异常 第一次崩溃位于我的 UIFont 扩展中 这
  • SpriteKit 碰撞检测中 SKSpriteNode 之间的间隙

    我已经尝试解决这个问题很长一段时间了 我有一个具有简单平台物理原理的游戏 其中玩家跌倒在一个方块上 这可以阻止他跌倒 这是可行的 但是玩家停止的位置和实际对象 精灵节点的位置之间存在明显的差距 这是一个屏幕截图 它应该是不言自明的 clas
  • 如何从通讯录 ios 以编程方式编辑电话号码值

    我正在尝试在 iOS 中以编程方式替换特定联系人的特定电话号码 获取联系人表单地址簿 我不知道为什么我无法保存新的电话号码并刷新地址簿以显示更改 我正在这样做 BOOL changeContactPhoneNumber NSString p
  • Objective-C 中 typedef 枚举语句在哪里?

    我担心的一个基本问题 以下代码有效 并且 typedef 枚举被识别 但我收到一条警告消息 空声明中无用的存储类说明符 我在这里做错了什么吗 这是放置 typedef 枚举的最佳位置吗 import
  • Swift - 预期 '{' 启动 setter 定义

    我正在关注高级 swift WWDC 2014 视频 使用类上的下标来委托给类属性 但使用与视频中相同的语法时出现错误 enum Direction case North South East West class Place Thing
  • 在 cocoa touch 中以编程方式将视图位置设置为右上角

    我需要确保一个视图 A 尺寸 200x200 始终与第二个视图 B 全屏尺寸 内的右上角对齐 我想确保无论设备方向如何 视图 A 都保留在该位置 事实是 当使用界面生成器来定位视图时 我对此没有任何问题 但我需要以编程方式构建它 我想我应该
  • iPhone UI 带有 Tableview 或 Scrollview? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 正确的标头 php mysql blob 显示图像

    我正在尝试在我的 PHP 页面中显示来自 mysql blob 的图像 我知道这不是最佳实践 然后我会将其引入我的 iOS 应用程序中 我在设置页面标题时遇到问题 我认为需要将其设置为图像 所以 这显示了图像 但我不相信页眉是正确的 hea
  • 有没有办法检测 iOS 设备进入睡眠模式(屏幕变黑时)时的事件?

    我想检测两个事件 设备被锁定 解锁 设备进入睡眠状态并且屏幕变黑 我在这里实现的第一个目标是 有没有办法检查 iOS 设备是否锁定 解锁 https stackoverflow com questions 14229955 is there
  • iOS Safari 通过单击按钮触发扫描信用卡

    您好 我目前正在创建一个测试应用程序 当用户单击文本字段名称或卡号时 扫描信用卡功能对我有用 我的问题是 我希望当用户单击 button1 时发生同样的情况 这应该打开相机来扫描卡并填充现有的文本字段 即名称 卡号和到期日期 额外的好处是
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • ios 如何存储用户输入的详细信息并取回?

    How to Store用户输入的详细信息和Get it Back在ios中 我有以下关注TextFields UserName Email Re enter Email id Phone State Address Localityand
  • iOS:如何获取设备当前语言设置?

    我的应用程序中的一些功能应该基于其运行设备的语言设置 我想获取实际的语言而不是某些国家 地区设置 例如 如果语言是英语 我不在乎它是美国 英国 澳大利亚等 我很熟悉NSLocale对象 但它似乎与Region Format设置而不是Lang
  • 使用 Swift(使用 SwiftJWT)和 REST API 连接到 Apple Store Connect - 失败并出现 401

    我正在尝试通过他们的 REST API 连接到 Apple Store Connect 虽然这在几天前有效 但我无法弄清楚为什么它停止工作 现在我无法通过身份验证 即我发出的服务器响应的每个请求都是 401 我是否遗漏了什么 我做什么 生成
  • 找不到此可执行文件的有效配置文件...(再次)

    我知道这个问题已经被问过并回答过多次 但我正在抓狂 因为所提出的解决方案似乎都不起作用 尽管有一个有效的配置文件 但据我所知 它与捆绑包标识符匹配 但我收到了上述错误 我已按照本网站上各种建议解决方案中的步骤进行操作 包括删除所有现有证书并
  • iTunes Connect 中缺少应用内购买部分

    我有一个应用程序处于准备提交状态 我还有该应用程序的应用程序内购买项目 上周我将它们链接到我的应用程序并提交以供审核 周末 开发商拒绝了它 现在我想重新提交修复后的版本 但 IAP 部分完全丢失 我怎样才能让它再次可见 我遇到过同样的问题
  • 应用程序被终止时是否会收到 iOS 静默通知

    当发送后台推送时 content available 1 对于被用户杀死的应用程序 该应用程序不会启动到后台模式 并且application didReceiveRemoteNotification fetchCompletionHandl

随机推荐