2012-05-24 142 views
2

我想让我的应用画一个以触摸坐标为中心的圆。iOS 5 - 触摸画一个圆圈

下面是我现在的代码,它确实搞砸了,我还没有任何绘画和使用上下文的练习。我在这里错过了什么?提前致谢。

视图控制器是UIViewController的

@implementation ViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
} 

- (void)viewDidUnload 
{ 
[super viewDidUnload]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *theTouch = [touches anyObject]; 

[self doSomething]; 

//[self.view setNeedsDisplay]; 

} 

- (void) drawCircleAtPoint:(CGPoint)point withRadius:(CGFloat)radius inContext:(CGContextRef)context{ 
UIGraphicsPushContext(context); 
CGContextBeginPath(context); 
CGContextAddArc(context, point.x, point.y, radius, 0, 2*M_PI, YES); 
CGContextFillPath(context); 
UIGraphicsPopContext(); 
} 

- (void)drawRect:(CGRect)rect 
{ 
CGPoint point; 
CGContextRef context = UIGraphicsGetCurrentContext(); 
point.x = self.view.bounds.origin.x + self.view.bounds.size.width/2; 
point.y = self.view.bounds.origin.y + self.view.bounds.size.height/2; 
CGContextSetLineWidth(context, 5.0); 
[[UIColor whiteColor] setFill]; 
[self drawCircleAtPoint:point withRadius:50 inContext:context]; 

} 

@end 

在这里,我想它画圆至少在屏幕中央的一个子类,但我不能这样做,即使这一点。

+1

你确认你正在运行你的drawRect和drawCircle代码?你为什么做白色填充?你的背景颜色是什么? – heckman

回答

4

drawRect是UIView类的一种方法。 它不会在ViewController中可用,因此不会被调用。

理想情况下,您应该做的是将drawRect和drawCircleAtPoint放置在UIView子类中。 在该视图类中添加触摸方法。 你可以称之为DrawCircleView或其他东西。

现在创建此自定义视图的对象,并将其作为子视图添加到viewController的viewDidLoad中。

在touches方法中调用setNeedsDisplay并将touvh的点存储在CGPoint实例变量中并在drawRect中访问它。

UPDATE

您可能希望保存先前绘制的圆。

有很多的可能性,选择适合你最好的东西,我没有给你详细的解释,但有足够的信息让你去。

  • 如果你想圆可编辑,那么你将不得不继续添加关于一个NSMutableArray中心,半径为一体对象的圆圈信息。 并且在drawRect的开始处,您将不得不在循环中重新绘制它们。

    逸岸,我建议你使用CGPath不断加入圈子这条道路,并添加路径的drawRect到CGContext上保持CGPath作为一个实例变种,使其保留了上次的drawRect调用以前的信息。 但是,如果你想能够用不同的颜色绘制圆形,那么它们必须位于不同的CGPath中 然后你可以将这些带有对象颜色信息的CGPath再次添加到可变数组中。

OR

  • 保存和重绘所有这些圈子如果阵列持续增长将阻碍性能。如果你不想撤消功能,或者你不想编辑以前的圈子。 然后,您可以将drawRect的末尾绘制的所有内容保存为imageData,然后将其保存为一个实例var,并在每次调用drawRect时重绘它,然后在其上绘制一个圆并将图像再次保存到同一个实例中。

例如:在drawRect结束时,您可以将屏幕图像保存为实例变量 _savedImage。

_savedImage = UIGraphicsGetImageFromCurrentImageContext(); 

,并同时在重新划分的的drawRect开始时,如果_savedImage 不是零然后,

[_savedImage drawInRect:rect]; 

,那么你可以得出你身边拍了拍点圆。 此外,如果你想,那么你可以保存绘制成你想要与实际图像文件随时随地:

NSData *imageData = UIImagePNGRepresentation(_savedImage); 
[imageData writeToFile:@"imageName.png"]; 

OR

  • 如果你愿意,你可以探索CGContextSaveGState() and CGContextRestoreGState() 它们被用来push和pop背景分别堆叠。 所以你可以得到最后的上下文并重绘它,在恢复和保存之间,你可以绘制你的圈子。检出这个stackoverflow后发表在同一个:Saving and restoring CGContext
+0

谢谢!但是每当我点击时,会画出一个新的圈子,旧圈子会被删除?我能做些什么来触摸新的圈子,并保留旧圈子? – nemesis

+0

检查我的更新@nemesis。 –

+0

其实我已经做到了!事情是 - 当你点击时,它会为圆圈产生一个随机半径,这是一个很酷的事情,因为我做了一个名为Circle的类,我存储它的坐标和半径以便在添加数组时重新绘制它们一个新的圈子。而我现在想做的,是让这些圈子不会相互重叠。我的意思是 - 如果圆弧中有5个大圆圈,并且您尝试在它们之间放置一个新圆圈,则会生成一定的半径。提出这个问题的另一种方法是:有什么方法可以确定某个CGRect是否相交? – nemesis

3

的drawRect的方法调用发生在的UIView,而不是在UIViewController中 - 在UIViewController的管理视图,并处理代表团和其他有关物品本身。绘图发生在viewController的视图属性中。

在你的情况,你将要做到以下几点:

  1. 子类的UIView用自己的观点,用的drawRect并实现画圆的方法有
  2. 换成你自己在厦门国际银行默认的UIView类(IB - >身份检查 - >自定义类)
  3. 胡克事件来检测手指触摸,然后强制其使用[视图setNeedsDisplay]

注刷新:■ ubclassing和覆盖UIImageView的drawRect什么都不做 - 它专门处理:

UIImageView类经过优化,可以将其图像绘制到显示屏上。 UIImageView不会调用drawRect:一个子类。如果您的子类需要 自定义绘图代码,建议您使用UIView作为基类 类。