- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 viewController,它显然是 UIViewController
的子类,名为 MapViewController
。在此 viewController 中,我使用 GPS 获取用户的位置。
我还有一个名为 DrawCircle
的 View 。此 View 是 UIView
的子类。
使用 drawCircle 我希望能够随时在我的 MapViewController 上绘图。但我不确定我是否理解这样做的概念。我知道我的绘图代码正在运行,我以前用过它。但我不知道如何使用 DrawCircle
在 MapViewController
上绘制。
在我看来,每当我调用 [myCustomView setNeedsDisplay]
时,它并没有在我的 View 中调用 DrawRect
方法。
这是一些代码:MapViewController.h
#import "DrawCircle.h"
@interface MapViewController: UIViewController <CLLocationManagerDelegate>{
DrawCircle *circleView;
}
@property (nonatomic, retain) DrawCircle *circleView;
@end
MapViewController.m
#import "DrawCircle.h"
@interface MapViewController ()
@end
@implementation MapViewController
@synthesize circleView;
- (void) viewDidLoad
{
circleView = [[DrawCircle alloc] init];
[self setNeedsDisplay];
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
DrawCircle.m
#import "DrawCircle.h"
@interface DrawCircle()
@end
@implementation DrawCircle
-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if(self) {
}
return self;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGPoint point = CGPointMake(40, 137);
CGContextAddEllipseInRect(ctx, CGRectMake(point.x, point.y, 10, 10));
}
CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor redColor] CGColor]));
CGContextFillPath(ctx);
}
此外,如果这对我的思维过程有任何帮助,这是我的 StoryBoard 场景。
viewcontrollers 自定义类是 MapViewController,views 自定义类是 DrawCircle。
**编辑:**我还想提一下,在我的 DrawCircle.m 中,我有从 MapViewController.m 调用的方法并且正在工作。
还有。最初,正在调用 DrawRect 方法,但我无法使用 setNeedsUpdate
手动调用。调试的时候连DrawRect方法都没有进入。
最佳答案
你正在创建你的 DrawCircle,但你永远不会将它添加到 View 中,例如
[self.view addSubview:circleView];
因此,它超出了范围,并且(如果使用 ARC)会向您发布。您似乎也没有设置它的 frame
,例如:
circleView = [[DrawCircle alloc] initWithFrame:self.view.bounds];
或者,您可以在界面生成器中添加 View (一个标准的 UIView
,然后在 IB 中指定您的自定义类)。
另外请注意,您通常甚至不需要调用 setNeedsDisplay
。将它添加到 View 层次结构将为您调用它。如果您需要根据某些自定义属性更新 View ,您只需要调用它。
就我个人而言,我倾向于这样定义 drawRect
:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
// I'd just use `rect` and I can then use the `frame` to coordinate location and size of the circle
CGContextAddEllipseInRect(ctx, rect);
// perhaps slightly simpler way of setting the color
CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]);
CGContextFillPath(ctx);
}
这样,圆圈的位置和大小将由我为圆圈设置的 frame
决定(顺便说一句,如果这使它更困惑,我深表歉意,但我使用了不同的类名 CircleView
,因为我喜欢在我的 UIView
子类的名称中包含 View
。
- (void)viewDidLoad
{
[super viewDidLoad];
UIView *circle;
circle = [[CircleView alloc] initWithFrame:CGRectMake(100.0, 100.0, 200.0, 200.0)];
circle.backgroundColor = [UIColor clearColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this
[self.view addSubview:circle];
circle = [[CircleView alloc] initWithFrame:CGRectMake(300.0, 300.0, 10.0, 10.0)];
circle.backgroundColor = [UIColor blackColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this
[self.view addSubview:circle];
}
关于ios - setNeedsDisplay 不触发 DrawRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16312168/
在我的代码中,我想要“动画”绘制一条线的延迟,因此在向 View 添加新线后,我调用 setNeedsDisplay - 一次就可以正常工作。 在drawRect方法中,我绘制线条并调用线条的方法来增
我正在尝试使用 MonoTouch 创建自定义 ProgressBar。我创建了一个用计时器重新绘制线条的类。我的问题是,当调用 SetNeedsDisplay 时, View 不会自行重绘。仅当提供
我注意到 Mac OS X 10.7 上基于 Cocoa 的应用程序存在一个奇怪的问题。由于某种原因(这里并不重要),有时我必须在自定义 View 的 drawRect 方法之外进行绘制。 我必须在我
我正在运行一个 Parse 程序,该程序获取数据并使用“findObjectsInBackgroundWithBlock”从中创建对象。完成后,我更新 self ,然后调用“[self.tableVi
每次使用 setNeedsDisplay 调用 drawRect 时,我都会显示大量图像。问题是导致滞后导致每次我调用 dracRect 时,我都会重新绘制每个图像(数千张)。 有没有办法不重绘所有图
下面的方法是在非主线程上调用的,具体来说,是在录音音频队列回调中 - (void)myMethod { //... dispatch_async(dispatch_get_main_queue(),
我最近开始学习在 View 上绘制核心图形,但每次调用 setNeedsDisplay 时,该方法都会运行,但不会触发 drawRect。在我的项目中,我在 View Controller 上有一个
我有一个自定义 View ,其中绘制了一个钢琴键盘。每个键都作为单独的调用绘制,因此我只能绘制需要重绘的键。该 View 支持多点触控,因此可以同时按住多个键。 每个键的绘制成本都有些高,因此每当在
在我的程序中,我使用 slider 更改当前所选颜色的 alpha 级别。 当 slider 更改其值时,它调用我的 setColor() 方法来更新使用新的 alpha 值更新当前颜色并更新显示当前
我正在 UIContainerView 中创建 subview ,它属于下面描述的类。这些值正确地打印到终端窗口,但实际上并没有显示在我定义的 subview 中。我认为 setNeedsDispla
我正在尝试重新加载 UIView。实际上我得到一个错误 Cannot convert value of type 'HomeViewController' to expected argument t
我对 setNeedsDisplay 更新 UIView 的不同用法感到困惑?当我尝试使用: [self.view setNeedsDisplay:YES]; 我发现我必须忽略参数才能使其适用于 UI
这里有人知道 setNeedsDisplay 是否会立即调用 drawRect 并立即更新屏幕吗?或者它只是一个排队的请求?谢谢。 最佳答案 View 直到下一个绘图周期才真正重绘。这只是通知系统应该
我看到很多与此问题相关的线程,但没有一个解决我的问题(我认为)。 我的情况应该很简单,我的 Controller 中有一个自定义 UIView,我在我的 Controller 中使用了 [self.m
使用drawRect、setNeedsDisplay和layoutSubViews等方法有什么基本规则吗?我相信它们会对应用程序性能产生不利影响。这些消息有任何首选替代方案吗? 最佳答案 虽然这不是
我有一个更新 View 的后台任务。该任务调用 -setNeedsDisplay 来绘制 View 。 这有效: - (void) drawChangesTask; { NSAutorelea
我的 ui 结构类似于 NSWindow -> NSViewController -> NSView(parent) -> NSView(target view)。目标 View 是从 XIB 文件中
我正在尝试制作一个非常简单的绘画应用程序(Cocoa)。在我的自定义 View 中,我有我的drawRect:方法,它在光标位置创建一个矩形: - (void)drawRect:(NSRect)rec
我有一个仅绘制的 UIView 派生 View 一次并且从未更新。 调用[self setNeedsDisplay]没有效果。什么可能导致这种情况? 绘图代码是否在无关紧要 drawRect: , 或
我正在尝试创建一个循环进度指示器。不幸的是,仅从 setNeedsDisplay 第一次和最后一次调用 drawRect 例程,它不会创建我正在寻找的渐变填充模式。我创建了一个 UIView 子类,在
我是一名优秀的程序员,十分优秀!