2

我正在尝试遵循有关如何在屏幕上绘制一些形状的指南,但在应用程序启动时它工作正常,但我无法使用“重新绘制”形状setNeedsDisplay我已经尝试了很多漂浮的东西,比如执行主线程,但它不起作用。

我的应用程序是由这个组成的:

在此处输入图像描述

我的 UIView 有它自己的类,DrawView. 这是我的代码:

绘图视图.h

#import <UIKit/UIKit.h>

NSInteger drawType;

@interface DrawView : UIView

-(void)drawRect:(CGRect)rect;
-(void)drawNow:(NSInteger)type;

@end

绘图视图.m

#import "DrawView.h"

@implementation DrawView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();
    UIColor *color = [UIColor orangeColor];
    CGContextSetStrokeColorWithColor(context, color.CGColor);
    CGContextSetFillColorWithColor(context, color.CGColor);

    NSLog(@"Type: %i",drawType);

    switch (drawType) {
            case 0:
                CGContextMoveToPoint(context, 10, 100);
                CGContextAddLineToPoint(context, 300, 300);
                CGContextSetLineWidth(context, 2.0);
                CGContextStrokePath(context);
                break;
            case 1:
                CGContextAddEllipseInRect(context,CGRectMake(10, 100, 300,440));
                CGContextDrawPath(context, kCGPathFillStroke);
                break;
            case 2:
                CGContextAddRect(context, CGRectMake(10, 100,300,300));
                CGContextDrawPath(context, kCGPathFillStroke);
                break;
            default:
                break;
    }

}


-(void)drawNow:(NSInteger)type {
    drawType = type;
    NSLog(@"Draw Now! %i",drawType);

    //[self setNeedsDisplay]; // Not working...
    //[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; // Not Working
}

@end

视图控制器.h

#import <UIKit/UIKit.h>
#import "DrawView.h"

DrawView *mydraw;

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UISegmentedControl *drawTypeSW;

- (IBAction)drawNow:(id)sender;
@end

视图控制器.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize drawTypeSW;

- (void)viewDidLoad
{
    [super viewDidLoad];
    mydraw = [[DrawView alloc] init];
}

- (void)viewDidUnload
{
    [self setDrawTypeSW:nil];
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (IBAction)drawNow:(id)sender {
    [mydraw drawNow:drawTypeSW.selectedSegmentIndex];
}
@end

当我打开应用程序时,会画一条线,但是当我尝试使用按钮绘制其他内容时,Draw Now它不起作用,什么也没有发生,- (void)drawRect:(CGRect)rect也没有被调用。为什么?我错过了什么?

谢谢 ;)

4

1 回答 1

3

进一步编辑,最终解决方案:正在创建的 DrawViewviewDidLoad没有作为子视图添加到 ViewController。添加以下行应使其正确显示(除了下面的其他修复):

[self.view addSubview:mydraw];

编辑:我的答案的扩展(它仍然存在,但我认为不再是问题的核心)。您在界面myDraw 之外声明(并在 DrawView 的头文件中执行类似的操作)。代替

DrawView *mydraw;

@interface ViewController : UIViewController
//snip
@end

尝试:

@interface ViewController : UIViewController
{
DrawView *mydraw;
}
//snip
@end

原始答案: 变量myDraw尚未正确初始化 -UIView需要使用 initWithFrame (用于编程创建)或 initWithCoder (在笔尖或情节提要中)进行初始化。使用 init 创建它意味着它的框架位置/大小为 0(并且其他 UIView 功能可能未正确初始化),这反过来意味着它不会正确绘制。

尝试 a) 在您的 nib/storyboard 中创建一个 UIView,将其转换为 DrawView,并使drawView您的 ViewController 定义中的字段成为该视图的出口。或者 b) 将其从您的笔尖中移除,使用 initWithFrame 创建您的 DrawView,并在屏幕上为其指定位置和大小。

于 2012-09-18T00:31:42.917 回答