`
jsntghf
  • 浏览: 2542726 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

手动调用drawRect方法出现的问题

    博客分类:
  • iOS
阅读更多

UINavigationBar+BackGroundImg.h

 

#import <UIKit/UIKit.h>

@interface UINavigationBar (BackGroundImg)

@end

 

UINavigationBar+BackGroundImg.m

 

#import "UINavigationBar+BackGroundImg.h"

@implementation UINavigationBar (BackGroundImg)

- (void)drawRect:(CGRect)rect {
    UIImage *img = [UIImage imageNamed:@"nav_bg.png"];
    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end

 

原来使用的[self.navigationController.navigationBar drawRect:CGRectZero];运行一切正常,但控制台输出报错信息:

 

<Error>: CGContextSaveGState: invalid context 0x0
<Error>: CGContextSetBlendMode: invalid context 0x0
<Error>: CGContextSetAlpha: invalid context 0x0
<Error>: CGContextTranslateCTM: invalid context 0x0
<Error>: CGContextScaleCTM: invalid context 0x0
<Error>: CGContextDrawImage: invalid context 0x0
<Error>: CGContextRestoreGState: invalid context 0x0

 

这是由于直接手动调用drawRect方法导致的。

 

将调用方式改成以下形式:

 

[self.navigationController.navigationBar setNeedsDisplay];

 

通过调用setNeedsDisplay方法,会自动调用到drawRect方法,这样问题就解决了。

分享到:
评论

相关推荐

    iOS的Swift中drawRect:的使用

    但如果你手动改变了视图的内容,记得调用`setNeedsDisplay()`或`setNeedsDisplay(in:)`方法来触发重绘。 ```swift self.setNeedsDisplay() // 触发整个视图重绘 self.setNeedsDisplay(in: someRect) // 只重绘指定...

    iOS的Object-C中drawRect:的使用

    通常,当视图的frame、bounds或transform属性发生变化,或者通过`setNeedsDisplay`或`setNeedsDisplayInRect:`方法手动标记视图需要刷新时,系统会调用`drawRect:`。 在`drawRect:`方法中,你可以使用Core Graphics...

    drawrect中实现橡皮擦功能(非背景色填充)

    如果你的视图没有自动调用`drawRect:`,则需要手动触发重绘,例如,通过调用`setNeedsDisplay`。 3. **设置橡皮擦属性**:在`CGContext`中,你可以设置线宽、颜色和混合模式。橡皮擦通常表现为无色(透明),线宽...

    图片裁剪自定义控件

    - 在iOS中,可以继承自`UIView`,并实现`drawRect:`方法,使用`Core Graphics`框架进行绘制。 2. **圆形裁剪**: - 圆形裁剪涉及到图像的圆形遮罩。在Android中,可以使用`Path`对象创建一个圆形路径,并在`...

    UITableViewCell的绘画

    默认情况下,这个方法并不需要我们手动去调用,因为系统会自动管理。然而,如果需要自定义单元格的外观,我们可能需要覆盖这个方法。 在描述中提到了"ABTableviewcell的简化",这可能是指作者创建了一个名为...

    自定义 进度条使用,柱状图实现方法

    这可以通过覆盖`onProgressChanged()`(如果继承自SeekBar)或者手动调用`invalidate()`来实现。`invalidate()`会触发视图的重绘过程。 4. 添加动态效果。为了实现动态柱状图,我们可能需要在`onProgressChanged()`...

    Canvas绘图程序_java_

    开发者也可以手动调用`repaint()`来请求重新绘制。 7. **缓冲区图像**: - 对于复杂的图形操作,可以先在内存中的BufferedImage对象上完成绘制,然后一次性将缓冲区图像绘制到Canvas上,提高效率。使用`Graphics2D...

    GraphicesDemo

    4. **三角形绘制**:虽然Canvas没有直接提供绘制三角形的方法,但可以通过`drawPath()`结合`moveTo()`、`lineTo()`等方法手动创建路径来实现。首先定义三个顶点,然后连接它们形成三角形。 5. **梯形绘制**:梯形的...

    自定义UINavigation

    4. **ARC支持**:ARC(Automatic Reference Counting)是iOS开发中的内存管理技术,它自动管理对象的生命周期,使得开发者不必手动调用`retain`、`release`和`autorelease`。在使用自定义UINavigation时,正确处理...

    cocoa常用类及方法

    `drawRect:`方法用于手动绘制视图内容,通常在需要自定义图形时使用。`setNeedsDisplay`触发视图的重绘,`backgroundColor`属性设置背景颜色,透明度可以通过`alpha`属性调整,隐藏视图则通过`hidden`属性。 `...

    带下划线与点击事件Label

    在`drawRect:`方法中,我们可以获取到UILabel的文本和尺寸,然后手动绘制一条与文本宽度相同的下划线。这个过程通常包括以下步骤: 1. 获取UILabel的文本和字体信息。 2. 计算文本的尺寸,这可以通过`...

    XCODE 下利用OPENGL ES 2.0绘制三角形DEMO

    为了看到结果,你还需要实现`display`方法,这通常是一个定时器回调,负责在每一帧时调用`drawRect:`进行渲染。你可以使用`CADisplayLink`创建一个与屏幕刷新同步的定时器。 在标签中提到的"XCODE IOS OPENGL ES ...

    Android-Android自定义View-仿淘宝淘抢购进度条

    可以使用Canvas的drawRect方法画出矩形,通过改变矩形的宽度来表示进度。为了实现动态效果,我们可以使用postInvalidate方法来周期性地重绘View,使得进度条能随着时间的推移逐步填充。 对于动画效果,Android提供...

    Android Canvas Demo

    - 当视图需要更新时,系统会自动调用onDraw()方法,我们无需手动触发。 6. **性能优化**: - 使用硬件加速:在CustomView的构造函数中启用硬件加速,可以提高绘制性能。 - 适当使用Bitmap.Config:选择合适的...

    ios-代码画的哆啦A梦.zip

    在这个DEMO中,开发者可能使用了`UIView`的`drawRect:`方法,该方法会在视图需要重绘时被调用,是进行自定义绘图的主要入口。 1. **图形绘制基础**:在`drawRect:`方法中,通常会使用`CGContextRef`,它是Core ...

    BCB TPanel控件透明源代码

    接下来,你需要遍历TPanel的所有子控件,并调用它们的`Invalidate`方法,使它们在父窗口的背景下正确显示。这一步确保了子控件不会被TPanel的透明背景覆盖。 7. **恢复原始背景颜色**: 最后,在`OnPaint`方法...

    Android代码-MyLittleCanvas,用来替代“难用”的canvas

    在原生Canvas中,你需要手动计算坐标,设置画笔样式等,而在`MyLittleCanvas`中,你可以直接调用如`drawLine()`、`drawRect()`、`drawCircle()`等方法,参数更直观,减少了计算和出错的可能性。 其次,`...

    Android 静止时钟

    3. **绘制时钟背景**:我们可以使用`drawRect()`方法绘制背景,或者用`drawCircle()`方法画出时钟的圆盘。 4. **绘制时钟指针**:时钟通常有小时、分钟和秒针。我们可以用`drawLine()`方法绘制直线代表指针,需要...

    JAVA双缓冲绘图源码

    注意,为了保持最佳性能,通常我们会将这些绘图操作封装到一个方法中,然后在事件驱动的GUI程序中,比如在paint或repaint方法中调用此方法。这样,每次窗口需要重绘时,都会自动应用双缓冲技术。 此外,Java Swing...

    电大JAVA语言作业答案

    16. `drawRect`方法:`drawRect`用于绘制矩形,参数包括起始坐标和矩形的宽度与高度。 17. 类文件生成:每个Java类在编译后都会生成一个与类名相同的`.class`文件。 18. Java与C/C++的差异: - 内存管理:Java...

Global site tag (gtag.js) - Google Analytics