使用 swift 在图像上覆盖文本

2023-11-24

我正在尝试使用 Swift 在图像上覆盖一些文本,并在此处查看此代码:(src:如何在 iOS Swift 中向图像添加文本)

这会将文本置于正中央。我一直在改变价值观

 var rect = CGRectMake(10,150, inImage.size.width,    
   inImage.size.height)

但我无法让文字显示在左下角。有人可以帮忙并展示我在这里缺少什么吗?

我使用这一行添加修改后的图像:

modImage = self.textToImage("000", inImage: UIImage(named:"thisImage.png")!, atPoint: CGPointMake(10, 400))

下面是函数...

func textToImage(drawText: NSString, inImage: UIImage, atPoint: CGPoint) -> UIImage{

    // Setup the font specific variables
    var textColor = UIColor.whiteColor()
    var textFont = UIFont(name: "Helvetica Bold", size: 12)!

    // Setup the image context using the passed image
    let scale = UIScreen.mainScreen().scale
    UIGraphicsBeginImageContextWithOptions(inImage.size, false, scale)

    // Setup the font attributes that will be later used to dictate how the text should be drawn
    let textFontAttributes = [
        NSFontAttributeName: textFont,
        NSForegroundColorAttributeName: textColor,
    ]

    // Put the image into a rectangle as large as the original image
    inImage.drawInRect(CGRectMake(0, 0, inImage.size.width, inImage.size.height))

    // Create a point within the space that is as bit as the image
    var rect = CGRectMake(atPoint.x, atPoint.y, inImage.size.width, inImage.size.height)

    // Draw the text into an image
    drawText.drawInRect(rect, withAttributes: textFontAttributes)

    // Create a new image out of the images we have created
    var newImage = UIGraphicsGetImageFromCurrentImageContext()

    // End the context now that we have the image we need
    UIGraphicsEndImageContext()

    //Pass the image back up to the caller
    return newImage

}

Details

xCode 9.1、斯威夫特 4

Solution

扩展 UIView

extension UIView {

    func copyObject<T: UIView> () -> T? {
        let archivedData = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as? T
    }
}

扩展 UIImage

 extension UIImage {

    typealias EditSubviewClosure<T: UIView> = (_ parentSize: CGSize, _ viewToAdd: T)->()

    func with<T: UIView>(view: T, editSubviewClosure: EditSubviewClosure<T>) -> UIImage {

        if let copiedView = view.copyObject() as? T {
            UIGraphicsBeginImageContext(size)

            let basicSize = CGRect(origin: .zero, size: size)
            draw(in: basicSize)
            editSubviewClosure(size, copiedView)
            copiedView.draw(basicSize)

            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage!
        }
        return self

    }
}

扩展 UIImageView

 extension UIImageView {

    enum ImageAddingMode {
        case changeOriginalImage
        case addSubview
        case addCopiedSubview
    }

    func drawOnCurrentImage<T: UIView>(view: T, mode: ImageAddingMode, editSubviewClosure: @escaping UIImage.EditSubviewClosure<T>) {

        guard let image = image else {
            return
        }

        let addSubView: (T) -> () = { view in
            editSubviewClosure(self.frame.size, view)
            self.addSubview(view)
        }

        switch mode {
            case .changeOriginalImage:
                self.image = image.with(view: view, editSubviewClosure: editSubviewClosure)

            case .addSubview:
                addSubView(view)

            case .addCopiedSubview:
                if let copiedView = view.copyObject() as? T {
                    addSubView(copiedView)
                }
        }
    }
}

Usage

Sample 1

func sample1(label: UILabel) {
    imageView.contentMode = .scaleAspectFit
    imageView.image = UIImage(named: "wall")?.with(view: label) { (parentSize, viewToAdd) in
        print("parentSize: \(parentSize)")
        viewToAdd.font = UIFont.systemFont(ofSize: 40)
        viewToAdd.textColor = .yellow
        viewToAdd.bounds = CGRect(x: 40, y: 40, width: 200, height: 40)
    }
}

enter image description here

Sample 2

func sample2(label: UILabel) {
    imageView.image = UIImage(named: "wall")
    imageView.contentMode = .scaleAspectFit
    imageView.drawOnCurrentImage(view: label, mode: .changeOriginalImage) { (parentSize, viewToAdd) in
        print("parentSize: \(parentSize)")
        viewToAdd.font = UIFont.systemFont(ofSize: 40)
        viewToAdd.textColor = .yellow
        viewToAdd.textAlignment = .right
        let width: CGFloat = 200
        let height: CGFloat = 30
        let indent: CGFloat = 40
        viewToAdd.bounds = CGRect(x: parentSize.width - width - indent, y: parentSize.height - height - indent, width: width, height: height)
    }
}

enter image description here

Sample 3

func sample3(label: UILabel) {
    imageView.image = UIImage(named: "wall")
    imageView.contentMode = .scaleAspectFill
    imageView.drawOnCurrentImage(view: label, mode: .addSubview) { (parentSize, viewToAdd) in
        print("parentSize: \(parentSize)")
        viewToAdd.font = UIFont.systemFont(ofSize: 16)
        viewToAdd.textColor = .yellow
        viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20)
    }
}

enter image description here

Sample 4

func sample4(label: UILabel) {
    imageView.image = UIImage(named: "wall")
    imageView.contentMode = .scaleAspectFill
    imageView.drawOnCurrentImage(view: label, mode: .addCopiedSubview) { (parentSize, viewToAdd) in
        print("parentSize: \(parentSize)")
        viewToAdd.font = UIFont.systemFont(ofSize: 16)
        viewToAdd.textColor = .yellow
        viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20)
    }
}

enter image description here

完整样本

不要忘记在此处添加解决方案代码

import UIKit

class ViewController: UIViewController {

    let imageView = UIImageView(frame: CGRect(x: 50, y: 50, width: 300, height: 300))

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let label = UILabel(frame: CGRect(x: 20, y: 20, width: 80, height: 30))
        label.text = "Blablabla"
        label.font = UIFont.systemFont(ofSize: 20)
        label.textColor = .black
        view.addSubview(label)

        sample1(label: label)
        //sample2(label: label)
        //sample3(label: label)
        //sample4(label: label)

        imageView.clipsToBounds = true
        view.addSubview(imageView)
    }

    func sample1(label: UILabel) {
        imageView.contentMode = .scaleAspectFit
        imageView.image = UIImage(named: "wall")?.with(view: label) { (parentSize, viewToAdd) in
            print("parentSize: \(parentSize)")
            viewToAdd.font = UIFont.systemFont(ofSize: 40)
            viewToAdd.textColor = .yellow
            viewToAdd.bounds = CGRect(x: 40, y: 40, width: 200, height: 20)
        }
    }

    func sample2(label: UILabel) {
        imageView.image = UIImage(named: "wall")
        imageView.contentMode = .scaleAspectFit
        imageView.drawOnCurrentImage(view: label, mode: .changeOriginalImage) { (parentSize, viewToAdd) in
            print("parentSize: \(parentSize)")
            viewToAdd.font = UIFont.systemFont(ofSize: 40)
            viewToAdd.textColor = .yellow
            viewToAdd.textAlignment = .right
            let width: CGFloat = 200
            let height: CGFloat = 30
            let indent: CGFloat = 40
            viewToAdd.bounds = CGRect(x: parentSize.width - width - indent, y: parentSize.height - height - indent, width: width, height: height)
        }
    }

    func sample3(label: UILabel) {
        imageView.image = UIImage(named: "wall")
        imageView.contentMode = .scaleAspectFill
        imageView.drawOnCurrentImage(view: label, mode: .addSubview) { (parentSize, viewToAdd) in
            print("parentSize: \(parentSize)")
            viewToAdd.font = UIFont.systemFont(ofSize: 16)
            viewToAdd.textColor = .yellow
            viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20)
        }
    }

    func sample4(label: UILabel) {
        imageView.image = UIImage(named: "wall")
        imageView.contentMode = .scaleAspectFill
        imageView.drawOnCurrentImage(view: label, mode: .addCopiedSubview) { (parentSize, viewToAdd) in
            print("parentSize: \(parentSize)")
            viewToAdd.font = UIFont.systemFont(ofSize: 16)
            viewToAdd.textColor = .yellow
            viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20)
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 swift 在图像上覆盖文本 的相关文章

  • iOS - UITableViewCell 使文本加粗

    我有一个字符串 NSString userInfo James Johnson james 我想做的就是大胆James Johnson并保留 james正常字体 所以我尝试过的是使用NSAttributedString但为了完成这个过程 我
  • 如何动态获取 UITableViewCell 的高度

    我创建了自定义的tableViewCell 我在UITableViewCell中添加了UIView SubView 所以我在 UIView 中的所有动态文本和图像内容都会根据文本和图像大小而变化 但现在 HeightforRowAtInde
  • 如何使用 CNContacts 快速获取手机号码?

    我有一些代码可以检索用户联系人中的所有电话号码 但只想过滤掉手机号码 目前 我只是通过将第一个数字为 或第二个数字为 7 的数字添加到数组中来实现此目的 如下所示 func findContacts gt CNContact let key
  • 错误消息:您输入的捆绑包 ID 已被使用

    我正在尝试发布一个 iPhone 应用程序 这不是第一个 我过去已经发表过其他的 因此 我在第一个和第二个表单中输入了所需的信息 然后填写了第三个大表单 您还可以在其中上传图标和屏幕截图 好吧 我在上传屏幕截图之前按下了 保存 按钮 因为我
  • 从未调用过交互式委托方法

    我想在 ViewController 1 和 NavigationViewController 2 之间进行交互式转换 NavigationController 通过按钮调用 因此呈现时没有交互转换 它可以通过按钮或 UIPanGestur
  • SwiftUI 意外地自动弹出 NavigationLink

    我有一个简单的用例 其中一个屏幕使用 NavigationLink 推送另一个屏幕 iOS 14 5 有一个奇怪的行为 即推送的屏幕在被推送后立即弹出 Code NavigationLink destination EmptyView Em
  • 在 Excel 中使用 VBA 设置图像透明度

    有没有办法使用 VBA 脚本对图像应用一些透明度 我录制了一个 宏 但似乎没有录制艺术效果 我已经找到了如何制作形状 但没有找到图像 这需要几个步骤 将自选图形 如矩形 放置在工作表上 使用以下方法将您的实际图片嵌入矩形中 ShapeRan
  • 有没有办法在 Firebase 中等待查询完成?

    我正在使用 TableView 在 Viewcontroller 中的 iOS 应用程序中进行查询 我想确保在继续加载 TableView 之前我的查询已经返回 有没有办法保证查询已经完成 None
  • Swift:长按手势识别器 - 检测轻击和长按

    我想连接一个动作 如果手势是点击 它会以特定的方式为对象设置动画 但如果按下持续时间超过 0 5 秒 它会执行其他操作 现在 我刚刚连接了动画 我不知道如何区分长按和点击 如何访问新闻持续时间以实现上述目的 IBAction func ta
  • 在 iOS 上使用 RNCryptor 异步解密大文件

    我需要在 iOS 上使用 RNCryptor 异步解密一个大文件 以便显示进度条 我在任何地方都找不到示例 因此尝试了我猜对的方法 但是 我想出的方法不起作用 解密器的处理程序从未被调用 并且线程在发送所有数据后因 EXC BAD ADDR
  • CATextLayer 上 iOS 6 中不需要的垂直填充

    背景 我在 iOS 5 中开始了我的项目 并构建了一个带有图层的漂亮按钮 我在按钮上添加了一个 textLayer 并使用以下代码将其居中 float textLayerVerticlePadding self bounds size he
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 关闭捕获上下文 Swift

    当我尝试更改闭包中的变量时出现此错误 A C function pointer cannot be formed from a closure that captures context 是否有解决方法或者仍然可以更改闭包内的变量 My C
  • 无法以编程方式快速设置 NSLayoutConstraint 乘数...“无法分配给此表达式的结果

    我试图以编程方式快速设置乘法器的约束 当我设置该值时 它只会给我错误 无法分配给该表达式的结果 我用 IBOutlet 声明了 NSLayoutConstraint 然后设置乘数 就像我对另一个常量所做的那样 效果很好 但这个不会接受它 I
  • 使用 UITabBarController 时覆盖整个屏幕的视图?

    我想在 UITabBarController 设置中在整个屏幕上覆盖 HUD 样式的透明图形 执行此操作的按钮位于第一个选项卡的屏幕 FirstViewController 中 并且覆盖层也应该覆盖选项卡 这可能吗 您可以将新视图直接附加到
  • 当应用程序进入前台时,如何重新启动基于块的动画?

    我有以下基于块的动画 UIView animateWithDuration 0 5f delay 0 0f options UIViewAnimationOptionRepeat UIViewAnimationOptionAutorever
  • 通过 Button Swift 中的标签发送行和部分

    我里面有这个cellForRowAtIndexPath cell plusBut tag indexPath row cell plusBut addTarget self action plusHit forControlEvents U
  • 将 SVG 文件转换为多个不同大小的 PNG 文件

    我有一个 SVG 格式的徽标图像 我想知道是否有办法生成多个不同大小的 png 文件 例如 我设置了 20 个不同的宽度和高度 它会生成 20 个 PNG 文件 如果我必须一次处理 5 张图像也没关系 我已经安装了 illustrator
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • Fitbit oauth2 公共 API 停止工作。给出错误 - 抱歉,这不是你..是我们

    几个月前 我准备了一个关于 Fitbit oauth2 公共 API 的演示 其中我使用特定用户登录并获取他的活动 一切正常 但最近 我打开演示并尝试使用同一用户登录 但它没有登录并反复出现此错误 我尝试更改在 Fitbit 上注册的演示应

随机推荐

  • 以编程方式添加自定义设置选项卡以管理 WooCommerce 中的产品数据

    我想以编程方式将设置选项卡添加到产品数据元框 如下所示 Verzendkosten 选项卡是通过 firebug 添加的 这意味着 运费 如何以编程方式在 woocommerce 编辑产品页面设置中添加 Verzendkosten 自定义选
  • 以编程方式呈现 Web UserControl

    我有一大堆UserControl对象 ascx文件 在他们自己的小项目中 然后 我在两个项目中引用该项目 REST API 这是一个类库项目 和主网站 我确信这在网站上很容易 只需使用Controls Add in any Panel或 A
  • 未调用自定义 AuthenticationProvider

    我想要一个基本的受身份验证保护的 REST 应用程序 我遵循了一般指示http www baeldung com spring security authentication provider为了让安全工作 我最终创建了我的实现Authen
  • Qt 5.5 与 qmake:链接器无法解析 OpenGL 函数调用

    当使用 Qt 5 5 qmake 和 MSVC 13 编译具有一些基本 OpenGL 函数调用的基本样板 Qt 应用程序时 我收到以下链接器错误 glwidget obj 1 error LNK2019 unresolved externa
  • Asp.net会员授权无需密码

    要对 Asp net 会员资格中的用户进行身份验证 我们可以调用方法 FormsAuthentication Authenticate username password 我怎样才能在没有用户密码的情况下完成同样的工作 生成会话 cooki
  • Microsoft.NET.Sdk.Worker 与 API 项目兼容吗?

    通过以下方式创建的 Visual Studio API 项目 新项目 ASP NET Core Web 应用程序 ASP NET Core Web API 结果是一个以 开头的项目文件
  • getApplicationContext()、getBaseContext()、getApplication()、getParent()

    有什么区别 getApplicationContext getBasecontext getApplication getParent 您能用一个简单的例子来详细说明吗 获取应用程序上下文 应用程序上下文与应用程序相关联 并且在整个生命周期
  • 在 Android 应用中使用 Firebase (BaaS) 存储电子邮件和密码时,如何包含用户名?

    火力基地createUser 方法需要一个电子邮件和密码字段 但如果我还想允许用户使用类似于 Snapchat Instagram StackOverflow 等的自定义用户名怎么办 有没有办法修改现有方法以接受该字段 或者我是否需要手动推
  • 为什么 Python 无法识别我的 utf-8 编码源文件?

    这是一个带有非 ASCII 字符的小 tmp py if name main s print s 运行它我收到以下错误 Traceback most recent call last File tmp py line 3 in
  • 在 plpython3u 过程中导入 Python 包时出现“找不到模块”

    我正在使用一个plpython3存储的函数 在postgres数据库上MacOS 与标准企业数据库包一起安装 我可以导入标准 python 包 例如 CREATE OR REPLACE FUNCTION foo x double preci
  • 仅将一条记录标记为默认的约束

    如何在表上设置约束 以便只有一条记录具有其isDefault位字段设置为 1 约束不是表范围 而是由 FormID 指定的每组行的一个默认值 使用唯一的过滤索引 在 SQL Server 2008 或更高版本上 您可以简单地使用唯一过滤索引
  • 在 Elasticsearch 插件中读取文件

    我正在编写一个 elasticsearch 插件 它依赖于从磁盘上的文件读取数据 当我尝试在代码中访问此文件时 出现以下异常 Caused by java security AccessControlException access den
  • Spring Boot 拦截所有异常处理程序

    我正在尝试执行一些适用于我所有的通用逻辑 ExceptionHandler代码中 我知道我可以写一个HandlerInterceptor拦截快乐路径 但我想挂钩异常处理生命周期 以便可以在呈现错误响应之前执行一些常见逻辑 例如日志记录 无论
  • CPP + 正则表达式验证 URL

    我想在 c MFC 中构建一个正则表达式来验证 URL 正则表达式必须满足以下条件 有效网址 http cu 241 dell tech co in MyWebSite ISAPIWEBSITE Denypage aspx http www
  • Android Contentprovider - 在插入方法中更新

    可以打电话吗SQLiteDatabase更新方法在insert 内容提供者的重写方法 基本上没问题 但由于你没有提供代码 我只能发布两种可能的方法 First In your content provider public Uri inse
  • 如何重置字典中的所有值

    green 0 y3 1 m tt 0 newaccount 0 egg 0 results 0 dan 0 Lewis 0 NewAccount2 0 testyear3 1 testyear6 0 NewAccount1 0 testy
  • 如何设置TextInputLayout错误消息颜色?

    如何更改可设置为显示在文本字段下方的错误消息的颜色TextInputLayout via setError 在这里查看错误状态 它通常显示为红色 我想改变它 我应该在我的项目中使用哪些项目名称 键styles xml文件来定位颜色 Edit
  • 使用 Jenkins 从机器 B 运行机器 A 的构建

    我有 2 台电脑 Com A Com B 我在 Com A 上使用 selenium webdriver Testng 和 maven 构建自动化功能脚本 Com A 已经安装了 Jenkins 的所有内容 但 Com B 只有 jenki
  • 避免 WordPress 插件上的 jquery 冲突的防弹方法

    我开发 WordPress 插件已经有一段时间了 我的所有插件似乎总是遇到以下问题 Jquery 冲突问题 我尝试了很多不同的方法来避免这些问题 但我总是让用户联系我说 当他们安装了我的一个插件时 它已经阻止了另一个插件的工作aahhhhh
  • 使用 swift 在图像上覆盖文本

    我正在尝试使用 Swift 在图像上覆盖一些文本 并在此处查看此代码 src 如何在 iOS Swift 中向图像添加文本 这会将文本置于正中央 我一直在改变价值观 var rect CGRectMake 10 150 inImage si