如何从视图控制器以编程方式绘制一条线?

2023-11-23

我有一个UIViewController。如何在以编程方式创建的视图之一中画一条线?


有两种常见的技术。

  1. Using CAShapeLayer:

    • 创建一个UIBezierPath(将坐标替换为您想要的任何坐标):

      UIBezierPath *path = [UIBezierPath bezierPath];
      [path moveToPoint:CGPointMake(10.0, 10.0)];
      [path addLineToPoint:CGPointMake(100.0, 100.0)];
      
    • 创建一个CAShapeLayer那个使用那个UIBezierPath:

      CAShapeLayer *shapeLayer = [CAShapeLayer layer];
      shapeLayer.path = [path CGPath];
      shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
      shapeLayer.lineWidth = 3.0;
      shapeLayer.fillColor = [[UIColor clearColor] CGColor];
      
    • 添加那个CAShapeLayer到你的视图层:

      [self.view.layer addSublayer:shapeLayer];
      

    在以前版本的 Xcode 中,您必须手动添加QuartzCore.framework 到您项目的“链接二进制文件与库”并导入<QuartzCore/QuartzCore.h>.m 文件中的标头,但这不再是必要的(如果您打开了“启用模块”和“自动链接框架”构建设置)。

  2. 另一种方法是子类化UIView然后使用核心图形调用在drawRect method:

    • 创建一个UIView子类并定义一个drawRect画出你的界线。

      您可以使用核心显卡来做到这一点:

      - (void)drawRect:(CGRect)rect {
          CGContextRef context = UIGraphicsGetCurrentContext();
      
          CGContextSetStrokeColorWithColor(context, [[UIColor blueColor] CGColor]);
          CGContextSetLineWidth(context, 3.0);
          CGContextMoveToPoint(context, 10.0, 10.0);
          CGContextAddLineToPoint(context, 100.0, 100.0);
          CGContextDrawPath(context, kCGPathStroke);
      }
      

      或者使用UIKit:

      - (void)drawRect:(CGRect)rect {
          UIBezierPath *path = [UIBezierPath bezierPath];
          [path moveToPoint:CGPointMake(10.0, 10.0)];
          [path addLineToPoint:CGPointMake(100.0, 100.0)];
          path.lineWidth = 3;
          [[UIColor blueColor] setStroke];
          [path stroke];
      }
      
    • 然后,您可以使用此视图类作为 NIB/storyboard 或视图的基类,也可以让视图控制器以编程方式将其添加为子视图:

      PathView *pathView = [[PathView alloc] initWithFrame:self.view.bounds];
      pathView.backgroundColor = [UIColor clearColor];
      
      [self.view addSubview: pathView];
      

上述两种方法的 Swift 版本如下:

  1. CAShapeLayer:

    // create path
    
    let path = UIBezierPath()
    path.move(to: CGPoint(x: 10, y: 10))
    path.addLine(to: CGPoint(x: 100, y: 100))
    
    // Create a `CAShapeLayer` that uses that `UIBezierPath`:
    
    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.cgPath
    shapeLayer.strokeColor = UIColor.blue.cgColor
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.lineWidth = 3
    
    // Add that `CAShapeLayer` to your view's layer:
    
    view.layer.addSublayer(shapeLayer)
    
  2. UIView子类:

    class PathView: UIView {
    
        var path: UIBezierPath?           { didSet { setNeedsDisplay() } }
        var pathColor: UIColor = .blue    { didSet { setNeedsDisplay() } }
    
        override func draw(_ rect: CGRect) {
            // stroke the path
    
            pathColor.setStroke()
            path?.stroke()
        }
    
    }
    

    并将其添加到您的视图层次结构中:

    let pathView = PathView()
    pathView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(pathView)
    
    NSLayoutConstraint.activate([
        pathView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        pathView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        pathView.topAnchor.constraint(equalTo: view.topAnchor),
        pathView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
    ])
    
    pathView.backgroundColor = .clear
    
    let path = UIBezierPath()
    path.move(to: CGPoint(x: 10, y: 10))
    path.addLine(to: CGPoint(x: 100, y: 100))
    path.lineWidth = 3
    
    pathView.path = path
    

    上面我补充一下PathView以编程方式,但您也可以通过 IB 添加它,然后设置它path以编程方式。

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

如何从视图控制器以编程方式绘制一条线? 的相关文章

  • 如何在IOS中的UIStackView中设置权重

    UIStackView与安卓类似LinearLayout但我不知道如何设置子视图的权重 假设我有一个垂直的UIStackView and 3 UIImageView就在里面 我想连续设置权重3 6 1UIImageViews 我怎么做 UI
  • 无法构建 Saurik 的 ldid 实用程序

    当我执行此命令 make sh 时 我遇到这些错误 构建用于越狱调整开发的 ldid 实用程序 Bilals Mac ldid billy make sh g arch i386 arch x86 64 arch ppc arch armv
  • XMPPFramework - 如何创建多用户聊天室?

    我如何使用XMPPFramework在iPhone中实现GroupChat 我尝试了以下代码 但房间没有创建 我如何知道房间是否创建 XMPPRoomDelegate没有被调用 当Stream断开连接时 调用handleDidLeaveRo
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 在 WKWebView 中禁用放大手势

    我正在寻找一种方法来禁用 WKWebView 的 iOS 实现上的 捏合缩放 放大手势 OS X 有一个 magnification BOOL 属性 但在 iOS 上似乎不可用 WKWebView h if TARGET OS IPHONE
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 导入 RNCryptor 后架构 armv7 的未定义符号

    我导入了 RNCryptor 可以在这里找到 https github com rnapier RNCryptor https github com rnapier RNCryptor进入我的应用程序 但是 我在日志中收到了三个错误 Und
  • 更改组织以使用 Xcode 9 在 iTunes Connect 上上传二进制文件

    我在 Xcode9 上配置了多个团队 当我尝试将二进制文件上传到 Xcode 9 上的 iTunes Connect 时 没有更改团队的选项 并且出现以下错误 ERROR ITMS 4088 来自苹果开发者论坛的解决方案 1 正常存档2 窗
  • 在 XCode 中链接静态 ObjC 库的过程

    我正在尝试链接到静态库 但不断收到链接器错误 我发现了一些发布示例的网站 但我无法看到我做错了什么 首先 我创建一个链接到我的库的项目 添加 gt 现有文件找到我的 xcodeproj 文件选择 将项目复制到目标组文件夹 选择我的宿主项目作
  • 将 SSLSetEnabledCiphers 与 AFNetworking 结合使用来禁用弱密码

    我正在尝试禁用一些密码 弱 例如单个 DES 单个 DES 40 位等 我尝试过使用这段代码在 Cocoa 中使用 CFSocket CFStream 时如何设置 SSL 密码 https stackoverflow com questio
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • Objective-C – 拥有包含 TestFlight SDK 的 TestFlight 配置

    我已按照 TestFlight 的说明复制 发布 配置 我还使用 TestFlight SDK 从我的应用程序获取实时报告 通过这样做 我必须在我的应用程序中包含一些 TestFlight 代码 当然 我不想在我的应用程序的发布版本中包含此
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • 在 iOS 中,如何创建一个始终位于所有其他视图控制器之上的按钮?

    无论是否呈现模态或用户执行任何类型的转场 有没有办法让按钮在整个应用程序中 始终位于顶部 而不是屏幕顶部 有什么方法可以让这个按钮可拖动并可捕捉到屏幕上吗 我正在以苹果自己的辅助触摸作为此类按钮的示例 您可以通过创建自己的子类来做到这一点U
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s
  • Xcode 8 / Swift 3:“UIViewController 类型的表达式?未使用”警告

    我有以下函数 它之前编译得很干净 但在 Xcode 8 中生成警告 func exitViewController navigationController popViewController animated true UIViewCon
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后

随机推荐

  • CSS Translate:translate() 属性最终的用途是什么?

    在 CSS3 中 动画是在各种供应商前缀下引入的 并带有过渡属性 现在 至少在纯 CSS 中 有两种方法可以使元素改变位置 将元素的位置设置为绝对位置并进行调整left right top and bottom Using vendor t
  • 当主线程繁忙时如何让Qt工作?

    我的程序的主线程 函数 main 在那里 是为非 GUI 任务保留的 它调用了许多冗长的计算函数 所有实现的 GUI 都在单独的线程中完成其工作 我现在将使用 Qt 实现另一个 GUI Qt 文档说所有与 GUI 相关的任务都应该在主线程中
  • 如何在本地下载pip依赖项? [复制]

    这个问题在这里已经有答案了 我正在运行我的 python 应用程序requirements txt包含各种依赖项的文件 我正在 Pivotal Cloud Foundry 环境中部署此应用程序 然而 我在其中部署的环境是气隙的 因此我似乎无
  • Django URLS,使用 ?在网址中

    我正在尝试进行一些 Django URL 匹配 我想要一些我有的网址http mysite com base sort type1 http mysite com base sort type2 etc 我不知道如何 URL 匹配这些表达式
  • 配置来自 Nifi 的 HTTP POST 请求

    我正在尝试从 REST 客户端访问 WCF 服务 我正在从 REST 客户端向 WCF 服务发送 POST 请求 详细如下 供大家参考 The 服务合同定义如下 ServiceContract public interface IBZTso
  • UWP 中的自定义内容对话框包含 3 个以上按钮

    我想显示一个内容对话框 其中包含比传统的主要和次要结果更多的内容 由于我无法重写 ContentDialogResult 枚举并向该属性添加选项 因此我似乎唯一的选择可能是创建自己的自定义控件 其工作方式与 ContentDialog 类似
  • AppDelegate for Cocoa 应用程序在 Xcode 6 中使用 Storyboards

    我有一个现有的 OS X 应用程序 在转换为 Storyboards 作为主界面后 我的应用程序委托不再被使用 之前 MainMenu xib 有一个 App Delegate 对象 我可以将其类设置为我的应用程序委托 然而 故事板不包含这
  • Chrome Service Worker iOS 支持

    随着 Apple 几个月前宣布 Service Worker 支持 iOS 11 3 我最近开始尝试让 Service Worker 在 iOS 上工作 在 Safari 上 它按预期工作 访问网站后 它可以离线工作 然而 当我尝试在 Ch
  • “6k 浏览次数”是什么意思以及如何在 PHP 中格式化该数字

    6k 浏览次数 是什么意思以及如何在 PHP 中格式化这个数字 k是缩写基洛前缀并表示千 所以6k就是六千 您可以使用以下除法函数来格式化数字 function format number prefixes kMGTPEZY if numb
  • SQL Server MERGE + 连接其他表

    我在数据库项目中使用 MERGE 语句从静态值集中填充参考数据 如下所示 MERGE INTO dbo User AS TARGET USING VALUES email protected My Name AS SOURCE UserNa
  • 这是在 C++ 中实现有界缓冲区的正确方法吗?

    Closed 这个问题是无关 目前不接受答案 我正在开发一个程序 该程序处理多个线程访问 存入和从有界缓冲区容器中取出的问题 我注意到线程的一些主要问题 并怀疑我的缓冲区在某处部分或根本不正确 为了确保我知道我在做什么 我希望检查一下我的缓
  • 通过 HTML/PHP 使用 htaccess 自定义登录

    我正在开发一个网站 该网站的目录受 htaccess 保护 我想创建一个自定义登录页面 而不是依赖浏览器默认页面 有人对此有经验吗 我想通过 HTML 表单进行连接 有人觉得可能吗 Thanks 是的 这是可能的 但您不应该使用 htacc
  • 在视图中显示当地时间

    在 config application rb 中 我的文件中有 config time zone UTC 不带引号 我假设这是为了将输入到视图中的用户时间转换为存储在数据库中的 UTC 我的问题是 如何将数据库中的 UTC 值转换为用户的
  • 创建 iOS/OSX 框架:在分发给其他开发人员之前是否有必要对其进行协同设计?

    我正在学习如何创建 iOS 和 OSX 框架 让我们以 iOS 为例 到目前为止 以下步骤对我有效 使用 sdk iphonesimulator 和 Build 操作的 xcodebuild 框架 使用 sdk iphoneos 和 Bui
  • 使用 iOS hooks 将照片发布到 Instagram

    我在 iOS 应用程序中使用以下代码来使用 Instagram iPhone 挂钩将照片发布到 Instagram 我只希望 打开方式 菜单有 Instagram 应用程序 没有其他应用程序 但就我而言 Camera 也出现了 如何限制 I
  • 在 slime REPL 中使用 clojure.contrib 函数

    我想在 REPL 的 slime 中使用 clojure contrib trace 命名空间中的函数 我怎样才能让史莱姆自动加载它们 一个相关的问题 如何将特定的命名空间添加到正在运行的 repl 中 在 clojure contrib
  • 尝试使用 ImageMagick 将 200 个 jpg 文件转换为 mp4。一遍又一遍地收到相同的错误

    我正在尝试将 200 个 ppm 文件中的 jpg 文件转换为一个 mp4 文件 在与 jpg 文件相同的目录中 我运行了以下代码 convert delay 6 quality 95 test ppm movie mp4 并收到此错误消息
  • 将参数列表传递给 shell 中的命令

    如果我有一个文件列表说file1 file20 如何运行以文件列表作为参数的命令 例如myccommand file1 file2 file20 如果你的列表在你的参数向量中 也就是说 如果你从以下内容开始 yourscript file1
  • 如何应用 ndimage.generic_filter()

    我正在尝试学习 ndimage 但不知道如何通用过滤器 功能有效 文档提到用户函数将应用于用户定义的足迹 但不知何故我无法做到 这是示例 gt gt gt import numpy as np gt gt gt from scipy imp
  • 如何从视图控制器以编程方式绘制一条线?

    我有一个UIViewController 如何在以编程方式创建的视图之一中画一条线 有两种常见的技术 Using CAShapeLayer 创建一个UIBezierPath 将坐标替换为您想要的任何坐标 UIBezierPath path