在 UIView 子类中调用drawRect

2024-04-24

我已经对 UIView 进行了子类化,并且实现了一个 drawRect 。我基本上希望在设置 CGPoint(这是此 UIView 的一个属性)之后调用此 drawRect。我该怎么做呢?这是我的代码:

-(id) initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super initWithCoder:aDecoder]) {
        point_.x = 0;
        self.page_ = [UIImage imageNamed:@"pages"];
    }
    return self;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    if (point_.x != 0){
        [self.page_ drawInRect:rect];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
        CGContextSetLineWidth(context, 1.0f);
        CGContextMoveToPoint(context, 40, point_.y); 
        CGContextAddLineToPoint(context, 420, point_.y);
        CGContextStrokePath(context);
    }
}

当我设置了这个 UIView 的点并在另一个 UIViewController 中调用 drawRect 时,如下所示:

 self.page_.point_ = CGPointMake(-100, self.title_.frameHeight + self.title_.frameX + 40);
    [self.page_ drawRect:self.page_.frame];

它给了我所有这些错误:

  <Error>: CGContextSaveGState: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetBlendMode: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetAlpha: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextTranslateCTM: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextScaleCTM: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextDrawImage: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextRestoreGState: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetLineWidth: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextMoveToPoint: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextAddLineToPoint: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextDrawPath: invalid context 0x0

为什么是这样?


你永远不应该打电话-drawRect:直接地。

Use -setNeedsDisplay反而:

self.page_.point_ = CGPointMake(-100, self.title_.frameHeight + self.title_.frameX + 40);
[self.page_ setNeedsDisplay];

如果您需要自定义绘图区域(又名CGRect这将被传递到-drawRect:), 您可以使用-setNeedsDisplayInRect:

As @罗布·梅奥夫 https://stackoverflow.com/users/77567/rob-mayoff已建议,您可以覆盖设置器point_财产:

- (void)setPoint_:(CGPoint)point {
   if(!CGPointEqualToPoint(point_, point)) {
      point_ = point;
      [self setNeedsDisplay];
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 UIView 子类中调用drawRect 的相关文章

随机推荐

  • 如何使用 PhoneGap 开发者应用程序调试 Phonegap

    Phonegap 刚刚推出了一种方法 可以通过使用以下命令在本地服务器上立即查看对 Phonegap 应用程序的更改 phonegap serve 然后下载 PhoneGap 开发者应用程序 说明在这里 http app phonegap
  • Docker 卷和主机权限

    当我运行 docker 镜像时 例如 docker run v home n1 workspace root workspace it rust latest bash 我在容器中创建一个目录 例如 mkdir root workspace
  • Servlet 过滤器在 AWS 上返回“代理错误”

    我已经设置了一个Filter为我的 GWT Web 应用程序添加爬网程序支持 这个想法是捕获所有包含 escaped fragment 并为爬虫提供快照 我已经设置了Filter使用 Guice 如下 filter through Craw
  • 如何将文件上传到 SharePoint 文件夹

    我一直在尝试将文件上传到我的 SharePoint 2013 服务器 我正在使用 REST API 从 Android 应用程序执行此操作 我只能上传文本文件 即 txt rtf 我就是这样做的 我点击的网址 https mysite co
  • 如何从 Android 手机获取 GPS 数据?

    有没有办法将 Android 手机的 GPS 数据连接 USB 有线 到 PC 我目前正在使用基于 gpsd 项目的 GPSTether 应用程序 我正在寻找比该应用程序提供更多控制且错误更少的替代方案 另外 是否有另一种方法可以在不使用任
  • 如何将 xsl 变量值传递给 javascript 函数

    我正在尝试将 xsl 变量值传递给 javascript 函数 我的 xsl 变量
  • 如何使用 python 在 mongoengine 中对 dict 中包含的嵌套字典或数组执行此类过滤查询?

    假设我有以下 dict 对象 a value of a somedict someinfo name Jordan food fries coke drink 如果我想使用 mongoengine 在 python 中应用查询过滤器 我该怎
  • 为 pandas 创建自定义插值函数

    我目前正在尝试使用 pandas 清理和填充一些缺失的时间序列数据 插值函数工作得很好 但是它没有我的数据集所需的一些 不太广泛使用的 插值函数 几个例子是一个简单的 最后 有效数据点 它会创建类似于阶跃函数的东西 或者类似对数或几何插值的
  • 为什么没有用户代理为视频元素实现 CSS 光标样式

    我想知道是否可以更改 CSS 属性cursor在默认 HTML5 上video元素 到目前为止 我的测试已经得出结论 没有用户代理 浏览器 实现cursor pointer默认情况下 所以你只剩下正常的操作系统箭头 控制指示器 当您尝试设置
  • “未捕获的引用错误:窗口未定义”p5.js Web Worker

    我有一个 javascript 代码 我将网络工作者与 p5 js 库一起使用 它不允许我使用 p5 的任何功能 所以我必须使用importScripts p5 js 在使用 p5 的任何函数之前导入 p5 js 库的函数 onmessag
  • Swift 泛型类作为委托

    我在 swift 中使用泛型类作为委托时遇到了问题 例如我尝试使用通用 NSFetchedResultsDelegate 定义为 class FetchedTableController
  • 使用 React 和 webpack 4 拆分项目; html 标签是意外的标记

    背景 我正在使用 React babel webpack4 和 es6 或者可能是 es7 我有一些模块被多个反应项目重用 因此 我创建了一个包含这些模块的 标准 文件夹 以便它们与任何特定项目分开 Problem 在我的 React 项目
  • 为 WinSocks 和 *nix 制作非阻塞套接字

    在 C C 中 如何将 WinSocks 和 nix 中的阻塞套接字转换为非阻塞套接字 这样 select 就能正常工作 您可以将预处理器用于特定于平台的代码 在Linux上 fcntl fd F SETFL O NONBLOCK Wind
  • Java 中的合成字段是什么? [复制]

    这个问题在这里已经有答案了 有人可以用一种易于理解的方式解释 Java 中合成字段的重要性吗 我记得在非静态内部类的上下文中阅读它 其中每个此类内部类实例都维护对封闭类的引用 为什么这样的引用 字段被称为合成字段 合成字段是编译器创建的字段
  • Xcode 永远快速索引

    我目前正在使用 swift 和 Xcode 6 Beta 3 开发一个 iOS 应用程序 到目前为止一切都很顺利 但现在随着我的项目的增长 Xcode 突然开始索引 并且一次又一次地这样做 使得 Xcode 几乎无法使用 我在网上搜索了类似
  • aws CLI 比使用 boto3 更快吗?

    我有存储在 s3 存储桶中的包 我需要读取每个包的元数据文件并将元数据传递给程序 我用了boto3 resource s3 在 python 中读取这些文件 该代码需要几分钟才能运行 如果我使用 aws clisync 它下载这些图元文件的
  • 更好的 boost asio Deadline_timer 示例

    我正在寻找一个更好的例子boost asio deadline timer 给出的例子总是会超时并调用close方法 我尝试打电话cancel 在计时器上但这会导致函数传递到async wait立即被呼叫 在异步 tcp 客户端中使用计时器
  • 使用 Ant 遍历目录

    假设我有一个包含以下路径的 PDF 文件集合 some path pdfs birds duck pdf some path pdfs birds goose pdf some path pdfs insects fly pdf some
  • 异步 REST API 生成警告

    我正在使用 Spring boot 应用程序 我有一个返回 Callable 的休息控制器 GetMapping fb roles Timed public Callable
  • 在 UIView 子类中调用drawRect

    我已经对 UIView 进行了子类化 并且实现了一个 drawRect 我基本上希望在设置 CGPoint 这是此 UIView 的一个属性 之后调用此 drawRect 我该怎么做呢 这是我的代码 id initWithCoder NSC