2012-09-17 137 views
2

我正在嘗試關注如何在屏幕上繪製某些形狀的指南,但在應用程序啓動時工作正常,但我無法使用setNeedsDisplay「重新繪製」形狀我嘗試了很多像在主線程上執行一樣的東西,但它不起作用。setNeedsDisplay not call drawRect:(CGRect)rect

我的應用程序是由這樣的:

enter image description here

我UIView有它自己的類,DrawView。這裏是我的代碼:

DrawView.h

#import <UIKit/UIKit.h> 

NSInteger drawType; 

@interface DrawView : UIView 

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

@end 

DrawView.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 

ViewController.h

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

DrawView *mydraw; 

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

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

ViewController.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不叫。爲什麼?我錯過了什麼?

謝謝;)

回答

3

進一步編輯,最終解決:在drawView函數正在viewDidLoad創建沒有被添加作爲一個子視圖到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)在你的筆尖/故事板中創建一個UIView,將它變成一個DrawView,並使你的ViewController定義中的drawView字段成爲該視圖的出口。或者b)從你的筆尖中刪除它,使用initWithFrame創建你的DrawView,並在屏幕上指定它的位置和大小。

+0

我改變了myDraw到界面裏面,它仍然沒有工作......你是什麼意思「UIViews需要使用initWithFrame初始化」。我在DrawView.h的' - (id)initWithFrame:(CGRect)框架內需要什麼?謝謝;) – TCB13

+0

沒有,如果你不需要任何自定義初始化。我指的是你在ViewController.m中實例化它的地方:'mydraw = [[DrawView alloc] init];'應該是更多沿'myDraw = [[DrawView alloc] initWithFrame:CGRectMake(20,100,200 ,200)];'(例如,CGRectMake的參數決定視圖的顯示位置)。鑑於你們說起初它確實畫了一條線,但我懷疑這不是問題 - 儘管它仍然是一個應該解決的問題。 – Xono

+0

我已經做出了改變;)問題依然存在。 – TCB13

相關問題