使用 UIBezierPath 的平行四边形视图

2023-12-26

我正在尝试使用创建自定义平行四边形视图UIBezierPath但没有得到一个完美的。

以下是我的自定义视图代码

class CustomView: UIView {
    override func draw(_ rect: CGRect) {
        let offset  = 60.0;
        let path = UIBezierPath()

           path.move(to: CGPoint(x: self.frame.origin.x + CGFloat(offset), y: self.frame.origin.y))
           path.addLine(to: CGPoint(x: self.frame.width + self.frame.origin.x  , y: self.frame.origin.y))
           path.addLine(to: CGPoint(x: self.frame.origin.x + self.frame.width - CGFloat(offset) , y: self.frame.origin.y + self.frame.height))
           path.addLine(to: CGPoint(x: self.frame.origin.x, y: self.frame.origin.y + self.frame.height))


        // Close the path. This will create the last line automatically.
         path.close()
        UIColor.red.setFill()
        path.fill()

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        self.layer.mask = shapeLayer;

    }
}

我使用创建视图

let customView = CustomView()
customView.frame = CGRect(origin: CGPoint(x: 10, y: 20), size: CGSize(width: 250, height: 250))
self.view.addSubview(customView)

但我得到的视图是这样的,它不是一个完美的平行四边形。


问题是使用frame https://developer.apple.com/documentation/uikit/uiview/1622621-frame within draw(_:)。问题是frame是“视图的大小和位置在其父视图的坐标系中”(强调)。通常,如何在此视图中渲染此形状与此视图在其父视图中的位置无关。如果这个视图恰好不在其父视图的 0, 0 处,您可以体验裁剪。

但不要使用rect https://developer.apple.com/documentation/uikit/uiview/1622529-draw参数,或者。 “第一次绘制视图时,这个矩形通常是视图的整个可见边界。然而,在后续的绘图操作中,矩形可能只指定视图的一部分。”如果操作系统决定只需要更新您的部分内容,那么您将面临形状发生根本改变的风险CustomView.

Use bounds https://developer.apple.com/documentation/uikit/uiview/1622580-bounds,相反,它位于视图自己的坐标系中。并且,使用minX, minY, maxX, and maxY稍微简化了代码。

@IBDesignable
class CustomView: UIView {

    @IBInspectable var offset:    CGFloat = 60        { didSet { setNeedsDisplay() } }
    @IBInspectable var fillColor: UIColor = .red      { didSet { setNeedsDisplay() } }

    override func draw(_ rect: CGRect) {
        let path = UIBezierPath()

        path.move(to: CGPoint(x: bounds.minX + offset, y: bounds.minY))
        path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
        path.addLine(to: CGPoint(x: bounds.maxX - offset, y: bounds.maxY))
        path.addLine(to: CGPoint(x: bounds.minX, y: bounds.maxY))

        // Close the path. This will create the last line automatically.
        path.close()
        fillColor.setFill()
        path.fill()
    }

}

顺便说一句,我没有设置面具。如果您正在制作动画,那么每次都不断地重置蒙版似乎可能效率低下draw叫做。我个人只是将视图的背景颜色设置为.clear。但这与眼前的问题无关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 UIBezierPath 的平行四边形视图 的相关文章

随机推荐

  • 如何使用 SetWindowsHookEx 和 WH_KEYBOARD 挂钩外部进程

    我试图挂钩例如记事本但没有成功 制作一个全局钩子似乎效果很好 在 XP SP2 上测试 编辑 修改后的代码现在可以使用 MyDLL代码 include
  • 如何以编程方式打印各种文件类型

    我正在编写一个应用程序 它执行一些测试并生成许多不同的报告 这些可以是标签 最终客户的 PDF 维修部门的 PDF XML 文件等的任意组合 根据报告类型 我需要将文件发送到文件系统或多种不同打印机 A4 标签等 之一 理想情况下不应该有弹
  • F# 是否具有与 C# 的“不安全”块等效的语法

    大量的数组边界检查会降低速度 对于二维数组尤其如此 有没有办法在 F 中编写不安全的代码块 我不是一个F http cs hubfs net blogs f team archive 2006 08 15 506 aspx程序员 但据我所知
  • 如何取消订阅使用 lambda 表达式的事件?

    我有以下代码让 GUI 响应集合中的更改 myObservableCollection CollectionChanged sender e gt UpdateMyUI 首先 这是一个好方法吗 第二 取消订阅此活动的代码是什么 是否相同 但
  • 如何在不指定变量来保存其 OUT 参数的情况下调用 PL/SQL 过程?

    我想调用指定了 OUT 参数的 PL SQL 存储过程 但我不关心返回值 我只关心程序是否成功执行 即没有抛出异常 我是否必须在调用 PL SQL 块中定义一个虚拟变量才能接收 out 参数 即使我不想要它 它使我的调用代码变得混乱 是的
  • 运行 Spark 作业时 CPU 使用率低

    我正在运行 Spark 作业 我有 4 个核心 工作内存设置为 5G 应用程序主机位于同一网络中的另一台计算机上 并且不托管任何工作程序 这是我的代码 private void myClass configuration of the sp
  • super(&nil) 在 ruby​​ 中做什么?

    我正在读书并发 ruby 的源代码 https github com ruby concurrency concurrent ruby blob master lib concurrent executor abstract executo
  • 在 Python 中并行处理大型 .csv 文件

    我正在使用 Python 脚本处理大型 CSV 文件 大约有 10M 行的几个 GB 的量级 这些文件具有不同的行长度 并且无法完全加载到内存中进行分析 每一行都由我的脚本中的函数单独处理 分析一个文件大约需要 20 分钟 看来磁盘访问速度
  • ASP.NET 身份验证

    我有以下登录页面 用户在其中输入用户名和密码 有了这些信息 我需要确保它们是 Admin1 角色的一部分 如果是这样 我想在用户的计算机上设置一个 cookie 使用下面的 User InRole 代码 它不会进入 if 语句 如果我取消注
  • 为什么 Android 2.3 中包含的本机 SIP 堆栈无法在 3g 上工作?

    我想知道为什么 Android 框架 自 2 3 起 中包含的本机 SIP 堆栈不能在 3g 上工作 这是否与谷歌对其合作伙伴可能有的任何法律或限制有关 此外 有人知道是否有计划取消该限制吗 Thx In 姜饼 http androidxr
  • 有选择地禁用多对多链接表上的级联删除

    是否可以有选择地删除 Entity Framework 5 Code First 中自动生成的多对多链接表上的级联删除选项 这是一个需要它的简单示例 public class Parent public int Id get set pub
  • Bootstrap中如何自动调整行高?

    我正在学习 Bootstrap 我正在尝试找出如何在给定以下条件的情况下自动调整行高 一个内有 3 行容器流体 row1必须调整其内容的高度 row3必须调整到其内容的高度并位于视口的底部 row2应调整其高度以适应之间的空间row1 an
  • 邀请好友参加活动 Facebook api

    我的脚本在邀请用户参加活动时非常慢 因为它必须检查用户是否已被邀请参加活动 否则会出现 facebook ouath 错误 我可以让它更快吗 foreach POST friends as ids if i lt 199 iZ facebo
  • Oracle 将 RAW 转换为日期格式

    我的 Oracle 数据库中有一个 RAW 字段 表示用户在系统中注册的日期 值是这样的24E2321A0000000000但是我需要将值转换为它代表的日期 等2008 12 25 15 04 31 我尝试过totimestamp see这
  • C# 情感分析 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个 最好是开源的 C 库可以用来计算某些给定文本的整体情绪 查看基于朴素贝叶斯分类的开源情感
  • 在键级别合并字典,然后在值级别合并字典

    我有两本字典 比如 Dictionary
  • NextJS 水合错误(文本内容与服务器渲染的 HTML 不匹配。)

    仅在部署应用程序时出现两个错误 而不是在开发模式或本地构建中 这完全是另一个问题 第一个错误 文本内容与服务器呈现的 HTML 不匹配 第二个错误 补水时出现错误 由于错误发生在 Suspense 边界之外 因此整个根将切换到客户端渲染 我
  • 如何通过 Restsharp 使用 multipart/form-data 上传 XML 文件?

    问题 如何通过 Restsharp 使用 multipart form data 上传 XML 文件 Problem 我使用 Peppol 通过 Codabox API 发送发票 我想将 xml 上传到其余服务 其余服务本身由提供商 Cod
  • 如何在 ArcGIS API for android 中使用标准 WMS 进行识别任务

    我想用Identify Task在 ARCGIS API for android I 使用this https developers arcgis com android sample code identify task 例如 它工作正常
  • 使用 UIBezierPath 的平行四边形视图

    我正在尝试使用创建自定义平行四边形视图UIBezierPath但没有得到一个完美的 以下是我的自定义视图代码 class CustomView UIView override func draw rect CGRect let offset