在viewController上使用自定义类(drawrect)

时间:2014-02-04 12:17:28

标签: ios objective-c xcode core-graphics xcode5

我是obj C的菜鸟,我觉得我做的一切都是正确的,所以请不要因此而讨厌我;)...我试图创建一个自定义类,在视图控制器上绘制一个矩形。

到目前为止,我已经用一个简单的代码创建了一个名为'Planet'的类。然后我将Planet类(自定义类选项卡)添加到故事板上的视图控制器。我没有错,但我也没有矩形。

Planet.h

#import <UIKit/UIKit.h>
@interface Planet : UIViewController
@end

Planet.m

#import "Planet.h"

@implementation Planet

-(void) drawRect:(CGRect)rect{
     CGRect rectangle = CGRectMake(0, 100, 320, 100);
     CGContextRef context = UIGraphicsGetCurrentContext();
     CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
     CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
     CGContextFillRect(context, rectangle);
}

@end

我的视图控制器的一个屏幕调用Planet类。

Xcode screenshot

...输出

No error

4 个答案:

答案 0 :(得分:3)

UIViewdrawRect方法。不是UIViewController

UIViewControllerUIView都是UIResponder的子类。 UIViewController不是UIView的子类。 并且UIView单独有drawRect方法。如果你在UIViewController中编写drawRect,它只是认为它是用户定义的函数而不会调用它。

如果您仍有疑问,在该drawRect函数中放置一个断点,看看它是否被调用。

答案 1 :(得分:0)

不是将Planet作为UIViewController的子类,而是将其作为UIView的子类。将一个Planet实例添加到视图控制器的视图中,可以使用viewWillAppear方法,例如:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    Planet *myPlanet = [[Planet alloc] initWithFrame:self.view.frame];
    [self.view addSubview:myPlanet];
}

答案 2 :(得分:0)

要解决此问题,只需将故事板中的类从Planet更改为之前的类。将UIView拖到视图控制器并将该视图的类更改为Planet。

你应该避免覆盖drawRect:如果你不需要它,因为它非常昂贵。 相反,你应该使用Layer。您可以使用CALayer绘制矩形:

// Remember to import QuartzCore.h framework
#import <QuartzCore/QuartzCore.h>

CALayer *myLayer = [CALayer layer];
myRect = CGRectMake(0.0f, 0.0f, 150.0f, 200.0f);
[myLayer setBounds:myRect];
[myLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[myLayer setBorderColor:[[UIColor clearColor] CGColor]];
[myLayer setBorderWidth:1.0f];

//You can change radius
[myLayer setCornerRadius:15.0];
[self.layer addSublayer:myLayer];

它比drawRect便宜得多:。

答案 3 :(得分:0)

使用

 [self.view setNeedsDisplay];

在视图中会出现添加子视图为星球(UIView)。