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方法,这样问题就解决了。
分享到:
相关推荐
但如果你手动改变了视图的内容,记得调用`setNeedsDisplay()`或`setNeedsDisplay(in:)`方法来触发重绘。 ```swift self.setNeedsDisplay() // 触发整个视图重绘 self.setNeedsDisplay(in: someRect) // 只重绘指定...
通常,当视图的frame、bounds或transform属性发生变化,或者通过`setNeedsDisplay`或`setNeedsDisplayInRect:`方法手动标记视图需要刷新时,系统会调用`drawRect:`。 在`drawRect:`方法中,你可以使用Core Graphics...
如果你的视图没有自动调用`drawRect:`,则需要手动触发重绘,例如,通过调用`setNeedsDisplay`。 3. **设置橡皮擦属性**:在`CGContext`中,你可以设置线宽、颜色和混合模式。橡皮擦通常表现为无色(透明),线宽...
- 在iOS中,可以继承自`UIView`,并实现`drawRect:`方法,使用`Core Graphics`框架进行绘制。 2. **圆形裁剪**: - 圆形裁剪涉及到图像的圆形遮罩。在Android中,可以使用`Path`对象创建一个圆形路径,并在`...
默认情况下,这个方法并不需要我们手动去调用,因为系统会自动管理。然而,如果需要自定义单元格的外观,我们可能需要覆盖这个方法。 在描述中提到了"ABTableviewcell的简化",这可能是指作者创建了一个名为...
这可以通过覆盖`onProgressChanged()`(如果继承自SeekBar)或者手动调用`invalidate()`来实现。`invalidate()`会触发视图的重绘过程。 4. 添加动态效果。为了实现动态柱状图,我们可能需要在`onProgressChanged()`...
开发者也可以手动调用`repaint()`来请求重新绘制。 7. **缓冲区图像**: - 对于复杂的图形操作,可以先在内存中的BufferedImage对象上完成绘制,然后一次性将缓冲区图像绘制到Canvas上,提高效率。使用`Graphics2D...
4. **三角形绘制**:虽然Canvas没有直接提供绘制三角形的方法,但可以通过`drawPath()`结合`moveTo()`、`lineTo()`等方法手动创建路径来实现。首先定义三个顶点,然后连接它们形成三角形。 5. **梯形绘制**:梯形的...
4. **ARC支持**:ARC(Automatic Reference Counting)是iOS开发中的内存管理技术,它自动管理对象的生命周期,使得开发者不必手动调用`retain`、`release`和`autorelease`。在使用自定义UINavigation时,正确处理...
`drawRect:`方法用于手动绘制视图内容,通常在需要自定义图形时使用。`setNeedsDisplay`触发视图的重绘,`backgroundColor`属性设置背景颜色,透明度可以通过`alpha`属性调整,隐藏视图则通过`hidden`属性。 `...
在`drawRect:`方法中,我们可以获取到UILabel的文本和尺寸,然后手动绘制一条与文本宽度相同的下划线。这个过程通常包括以下步骤: 1. 获取UILabel的文本和字体信息。 2. 计算文本的尺寸,这可以通过`...
为了看到结果,你还需要实现`display`方法,这通常是一个定时器回调,负责在每一帧时调用`drawRect:`进行渲染。你可以使用`CADisplayLink`创建一个与屏幕刷新同步的定时器。 在标签中提到的"XCODE IOS OPENGL ES ...
可以使用Canvas的drawRect方法画出矩形,通过改变矩形的宽度来表示进度。为了实现动态效果,我们可以使用postInvalidate方法来周期性地重绘View,使得进度条能随着时间的推移逐步填充。 对于动画效果,Android提供...
- 当视图需要更新时,系统会自动调用onDraw()方法,我们无需手动触发。 6. **性能优化**: - 使用硬件加速:在CustomView的构造函数中启用硬件加速,可以提高绘制性能。 - 适当使用Bitmap.Config:选择合适的...
在这个DEMO中,开发者可能使用了`UIView`的`drawRect:`方法,该方法会在视图需要重绘时被调用,是进行自定义绘图的主要入口。 1. **图形绘制基础**:在`drawRect:`方法中,通常会使用`CGContextRef`,它是Core ...
接下来,你需要遍历TPanel的所有子控件,并调用它们的`Invalidate`方法,使它们在父窗口的背景下正确显示。这一步确保了子控件不会被TPanel的透明背景覆盖。 7. **恢复原始背景颜色**: 最后,在`OnPaint`方法...
在原生Canvas中,你需要手动计算坐标,设置画笔样式等,而在`MyLittleCanvas`中,你可以直接调用如`drawLine()`、`drawRect()`、`drawCircle()`等方法,参数更直观,减少了计算和出错的可能性。 其次,`...
3. **绘制时钟背景**:我们可以使用`drawRect()`方法绘制背景,或者用`drawCircle()`方法画出时钟的圆盘。 4. **绘制时钟指针**:时钟通常有小时、分钟和秒针。我们可以用`drawLine()`方法绘制直线代表指针,需要...
注意,为了保持最佳性能,通常我们会将这些绘图操作封装到一个方法中,然后在事件驱动的GUI程序中,比如在paint或repaint方法中调用此方法。这样,每次窗口需要重绘时,都会自动应用双缓冲技术。 此外,Java Swing...
16. `drawRect`方法:`drawRect`用于绘制矩形,参数包括起始坐标和矩形的宽度与高度。 17. 类文件生成:每个Java类在编译后都会生成一个与类名相同的`.class`文件。 18. Java与C/C++的差异: - 内存管理:Java...