首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Draw方法不是从自定义UIView调用的

在iOS开发中,draw 方法是 UIView 类的一个核心方法,用于自定义视图的绘制。如果你发现 draw 方法没有被调用,可能是以下几个原因:

基础概念

draw(_:) 方法是 UIView 的一个生命周期方法,它在视图需要重绘时被系统调用。通常,你会重写这个方法来添加自定义的绘制代码。

可能的原因

  1. 视图未被添加到视图层次结构中:如果自定义的 UIView 实例没有被添加到任何父视图中,draw 方法不会被调用。
  2. 视图的 isHidden 属性被设置为 true:隐藏的视图不会调用 draw 方法。
  3. 视图的 alpha 属性设置为0:完全透明的视图也不会触发 draw 方法。
  4. 视图的 frame 为零:如果视图的尺寸为零,它也不会被绘制。
  5. 使用了自动布局而没有正确设置约束:可能导致视图没有正确的尺寸,从而不触发绘制。
  6. 直接调用了 setNeedsDisplay()setNeedsDisplay(_:) 方法:这些方法会标记视图需要重绘,但如果视图不在屏幕上或者被隐藏,draw 方法仍然不会被调用。

解决方法

  1. 确保视图已添加到视图层次结构中
  2. 确保视图已添加到视图层次结构中
  3. 检查视图的可见性属性
  4. 检查视图的可见性属性
  5. 确认视图的尺寸
  6. 确认视图的尺寸
  7. 使用自动布局时设置正确的约束
  8. 使用自动布局时设置正确的约束
  9. 调用 setNeedsDisplay() 来请求重绘
  10. 调用 setNeedsDisplay() 来请求重绘

示例代码

下面是一个简单的自定义 UIView 类,重写了 draw(_:) 方法:

代码语言:txt
复制
class CustomView: UIView {
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        // 自定义绘制代码
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(UIColor.blue.cgColor)
        context?.fill(rect)
    }
}

确保在使用这个自定义视图时遵循上述的检查步骤。

应用场景

自定义视图的绘制通常用于实现复杂的图形效果、动画、或者需要精细控制的界面元素。

通过以上步骤,你应该能够解决 draw 方法未被调用的问题。如果问题仍然存在,可能需要进一步检查视图的生命周期和布局代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

UIview

框架定义了视图的起源和维度的坐标系统中常用它的父视图和布局调整视图的大小或位置。中心属性可以用来调整视图的位置不改变它的大小。边界定义视图,把他们的内部维度和几乎完全用于自定义代码。...视图包含使用UIKit定制内容或核心图形、系统调用视图的draw(_:)方法。该方法的实现负责绘制视图的内容到当前图形上下文,这是系统设置的自动调用该方法之前。...这可以通过调用视图的setNeedsDisplay()或setNeedsDisplay(_:)方法。这些方法让系统知道它应该更新视图在下一次draw的时候。...因为它将等待下一个绘图周期更新视图中,您可以调用这些方法在多个视图同一时间更新他们。...因此,你应该叫UIView类的方法从代码中运行您的应用程序的主线程。这可能不是严格必需是唯一一次在创建视图对象本身,而是所有其他操作应该发生在主线程。

71710
  • Hive的自定义函数与通过reflect调用java方法

    本篇博客小菌为大家带来的是关于Hive自定义函数的相关内容! 首先先让我们来看下系统自带的函数有哪些!...发现hive自带的函数就有近一百个,但我们平时经常用到的可能就那么几个,并且自带的函数功能还十分受限!有时候,为了更好的实现业务需求,可能就需要我们去自定义Hive!...第五步:创建临时函数(永久的函数将temporary删掉) ? 第六步:调用验证 ?...通过reflect调用java方法 经历完了上面自定义函数过后,相信大家一定还是觉得过程有点繁琐。不用担心,接下来小菌将为大家带来如何在Hive中调用java方法。...第三步:调用 select reflect (‘参数一’,‘参数二’,‘参数三’) 参数一: 包名-类名 参数二: 方法名 参数三:需要计算的数据 ?

    1.6K30

    YYText源码解读-YYText同步异步渲染流程(一)—UIView与CALayer

    同时CALayer提供了一个+layerClass方法,我们可以通过重写这个方法返回一个我们自定义的CALayer的子类的类型,这时,UIView会自动创建一个我们自定义子类类型的Layer作为View...会在前一个动画结束后,才会刷新新的属性。也就是说Layer的属性不是实时显示在屏幕上的,那么我们怎样获取此时屏幕上属性值呢?...3 display 这个方法不要主动调用,通过调用Layer的代理的display(_:)方法或者Layer的draw(in:) 方法,会自动调用改方法。这个方法的作用是设置contents属性。...我们可以重写这个方法,来设置自定义的contents。...从Xcode的接口声明中可以指导,该方法不会立即调用display方法,而是做一个标记,在Layer下一次提交时,先调用display方法。

    75300

    @antvg6 自定义节点 调用被复写的方法

    版本 @antv/g6": “^4.8.10” 场景 @antv/g6通过继承的方法实现自定义形状时,自定义的函数会复写被继承的形状的对应函数,导致被继承的形状的某些特性丢失,通过以下方法解决此问题 方法...shapeFactory.getShape('circle') register('my-circle', { afterDraw(cfg, group, rst) { // 调用被继承的形状定义的逻辑...: Item) { // 调用被继承的形状定义的逻辑 if (extendShape && extendShape.setState) {...获取被继承的形状定义,如果被继承的定义不存在则使用一个空的定义实现ShapeFramework const extendShape = extendShapeType ?...合并定义,被继承的形状定义中的成员被直接覆盖 shapeObj = { ...extendShape, ...nodeDefinition }; } shapeObj.type

    83730

    IOS渲染流程之提交图层数据至RenderThread进程

    代表Bitamp,渲染流程后的Bitmap被存储在content属性中(这个bitmpa也叫back store)UIView代表视图树对应的CALayer对应图层树 分离UIView和CALayer的目的在于...渲染流程基于顶点,基于纹理(直接提供图片): 1.使用图片纹理:contents属性配置 数据类型为id而不是CGImage是为了适配MAC OS系统,MAC OS系统中定义CFImage和NSImage...都起作用 2.自己基于顶点来处理数据,手动绘制 顶点的需要自己计算纹理,光照信息用于片段主色器显示颜色 UIView中有一个drawRect方法用于实现自定义绘制,由Core Graphics处理绘制寄宿图..., 实现原理:drawRect是CALayer的方法,CALayer中有一个delegete代理的属性,UIView实现了这个代理的协议,因此CALayer请求代理(UIView)得到数据,代理可以设置...,更新视图树流程:(Application阶段,生成图元信息) 类似于Android的绘制流程 measure,layout,draw IOS: layout,display,prepare,commit

    49810

    iOS 之 异步绘制原理

    首先 UIView 调用 setNeedsDisplay 方法 其实是调用其 layer 属性的同名方法(view.layer setNeedsDisplay) 这时 layer 并不会立刻调用 display...然后在合适的时机回调代理,调用 drawRect 默认操作是什么都不做(而之所以有这个接口,就是为了让我们在系统绘制之后,还可以做些自定义的绘制工作)。...首先在主线程调用 setNeedsdispay 方法 系统会在 runloop 将要结束的时候调用 [CAlayer display] 方法 如果我们的代理实现了dispayLayer 这个方法,会调用...面试考点 ---- ▐ 我们调用 [UIView setNeedsDisplay] 方法的时候,不会立马发送对应视图的绘制工作,为什么?...调用 [UIView setNeedsDisplay] 后, 然后会调用系统的同名方法 [view.layer setNeedsDisplay] 方法并在当前 view 上面打上一个脏标记 当前 Runloop

    3.3K30

    它调用了我自定义的 get 方法!

    该同学在类中自定义了 get 方法,在该 get 方法中引用了一个对象,由于某段代码中 “没有用到”该方法就没注入,最后出现了空指针。...由于自己确定没有主动调用这个方法,排查了半天,借助 arthas 看 trace 才发现这个坑。...toJSONString 方法转 JSON 时,底层是通过解析 get 方法来识别属性的,它认为有一个 value 属性,转为 JSON 字符串时会自动调用对应的 get 方法获取 value 属性的值...如果自定义的 get 方法中使用到了尚没有设置的对象,由于并没有显示调用 getAddress 方法,很多人并不会意识到需要注入 repository 对象,如果调用了 toJSONString 方法就极容易出现空指针异常...log.info("过程中某个日志, 参数:{}", JSON.toJSONString(student)); } } 三、如何解决 方法一:自定义的方法避免定义为 get 开头。

    1K10

    android里面自定义View实现调用activity的方法怎么做

    在android客户端中我们经常有自己的定义视图,特别是用fragment的时候,用的还是比较多的,有时候很多响应时间都是在VIew里面完成,发现有时候调用activity的方法都是碰到就搞了,后来越来越发现有些调用底层的硬件的方法是没法搞的...(mCt) 方法二: 直接构造 :new BasicLineView(this) 这两个方法是有区别的,区别很大的,导致你后面调用底层方法是没法用的,换句话说就是无法转换 方法一  其实少用,只是有时候我们用了第三方插件...,他需要你传递的context获取是  this.getApplicationContext();这种形式的,比如百度地图 这种传递context  他实际基类是 application的,不是activity...的,这样就无法从context直接转成activity了, 方法二  是可以直接转换的,他的确定就是传递的上下文如果碰到第三方插件需要的context是没法直接用的,还需要再转化下,还有其他的情况也是无法直接使用的..., 2)使用接口来搞定调用底层的方法 这个方法是很安全的一种方法,就是搞起来比较麻烦,代码要写好多,那像上面的方法一句话,强制转换,各有各的好处, 接口的做法就是先在View里面写上一个接口,然后再写个

    2.3K10

    DEDECMS 字段的添加和调用方法 织梦自定义内容模型管理

    要想实现如下效果: 图片 字段的添加和调用方法-DEDECMS自定义内容模型管理 这里的价格的调用,dedecms默认是没有这个标签的,那我们如果实现这个价格的调用呢?...在这里我们就需要使用到dedecms模型里的自定义字段了,下面我们以dedecms5.7为例介绍一下dedecms字段的添加和调用方法。...如图: 图片 字段的添加和调用方法-DEDECMS自定义内容模型管理 点击进入“内容模型管理”这是右侧会显示相应的各个模型了,下面我们以文章模型为例讲解自定义字段的添加。...字段的添加和调用方法-DEDECMS自定义内容模型管理 图片 进入以后我们会看到有个“添加新字段”的按钮 图片 字段的添加和调用方法-DEDECMS自定义内容模型管理 点击“添加新字段”按钮进入,这时看到的就是添加字段的界面了...字段的添加和调用方法-DEDECMS自定义内容模型管理 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持米米素材网。

    46810

    图层树和寄宿图 -- iOS Core Animation 系列一

    视图在层级关系中可以互相嵌套,一个视图可以管理它的所有子视图的位置。 在iOS中,所有的视图都是从UIView这个基类派生出来的。...-drawRect: 通过继承UIView来实现此方法进行自定义绘制。这个方法默认是没有被实现的。因为对于UIView来说,寄宿图不是必须的。...如果你不需要寄宿图,不要写这个方法,会造成资源浪费,详细部分见《内存恶鬼drawRect》 视图在屏幕上出现的时候-drawRect:会自动被调用。...-drawRect:方法里面的代码利用Core Graphics绘制一个寄宿图,然后被缓存起来直到需要被更显(一般是调用了- setNeedDisplay方法)。...在blueLayer上显式调用了-display。因为当图层显示在屏幕上时,CALayer不会自动重绘,这和UIView不同。需要手动调用。 我们没有调用masksToBounds。

    1.2K20

    currentstyle 织梦_织梦导航高亮标签currentstyle调用自定义字段的方法

    大家好,又见面了,我是你们的朋友全栈君。...用织梦仿站时候,经常会使用currentstyle标签高亮当前的栏目,具体代码为: currentstyle=’ ~typename~’ 但是在实际建站操作中经常调用自定义字段,大家会发现在用currentstyle...的时候读取不出自定义字段的内容了。...我们打开/include/taglib/channel.lib.php文件,在136行找到: row[‘typelink’] = GetOneTypeUrlA(row); 2、按照格式规则写入我们需要调用的自定义字段...例如,我们要调用abcd字段名,那么我们就这样写: linkOkstr = str_replace(“~abcd~”,row[‘abcd’], 示例: //处理同级栏目中,当前栏目的样式 if( (row

    6.5K10

    Asp.Net MVC对类HtmlHelper的自定义扩展方法以及如何调用

    大家可以看到这是微软MVC中自带的针对TextBoxFor的三个重载方法。那么我们还可以针对TextBoxFor进行我们自定义的扩展(想要什么样式,只要我们能实现),那么在调用时就方便多了。...它不会与系统自带的冲突,因为他们虽然方法名一样,但是参数类型不太一样,这个在自己扩展的时候注意一下就可以了。 我们调用一下试试 ?...看之前的三个重载现在变成了四个,而且截图的这个正好是我们自定义扩展的。...当然我们调用之前应该要引用的,这里提供三种方法进行引用: 第一种:在相对应的视图View中进行页面引用即可 @using 命名空间 第二种:可以在web.config中进行配置,那么就不需要在视图中进行引用...System.Web.Mvc.Html,然后将我们自定义扩展方法的命名空间也更改成这个那么就即不用配置也不用引用了。

    1.5K10

    带你快速掌握Flutter的视图(Widgets)

    如何绘图(Canvas draw/paint)? 如何构建自定义Widgets? 如何设置Widget的透明度? 通过这篇文章的学习,将为你揭开这些答案。 谁是Flutter中View?...这些对象都是 UIView 的实例。它们可以用作容器来承载其他的 UIView,最终构成你的界面布局。...在Android中,我们可以调用父级控件的addChild或removeChild方法以动态添加或删除View。...在Android中,可以通过继承View或已经存在的某个控件,然后覆盖其绘制方法来实现自定义View; 在iOS中,可以通过编写 UIView 的子类,或使用已经存在的 view 来重载并实现方法,以达到特定的功能...; 在 Flutter 中,推荐组合多个小的 Widgets 来构建一个自定义的 Widget(而不是扩展它)。

    11K10

    layoutSubviews 详解

    5、旋转Screen会触发父UIView上的layoutSubviews事件 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 在苹果的官方文档中强调...”的,可以直接调用[view layoutIfNeeded] 重绘 -drawRect:(CGRect)rect方法:重写此方法,执行重绘任务 -setNeedsDisplay方法:标记为需要重绘...方法调用先于drawRect setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews layoutIfNeeded...方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的 layoutIfNeeded遍历的不是superview链,...应该是subviews链 drawRect是对receiver的重绘,能获得context setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,

    48730

    layoutSubviews总结

    5、旋转Screen会触发父UIView上的layoutSubviews事件 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 在苹果的官方文档中强调...”的,能够直接调用[view layoutIfNeeded] 重绘 -drawRect:(CGRect)rect方法:重写此方法,运行重绘任务 -setNeedsDisplay方法:标记为须要重绘...方法调用先于drawRect setNeedsLayout在receiver标上一个须要被又一次布局的标记,在系统runloop的下一个周期自己主动调用layoutSubviews layoutIfNeeded...方法如其名,UIKit会推断该receiver是否须要layout.依据Apple官方文档,layoutIfNeeded方法应该是这种 layoutIfNeeded遍历的不是superview链,应该是...subviews链 drawRect是对receiver的重绘,能获得context setNeedDisplay在receiver标上一个须要被又一次画图的标记,在下一个draw周期自己主动重绘,

    25420
    领券