2

画面にいくつかの図形を描画する方法についてのガイドに従おうとしていますが、アプリの起動時には正常に機能しますが、setNeedsDisplay実行するなど、さまざまなものを使って図形を「再描画」することはできません。メインスレッドですが、機能しません。

私のアプリはこれでできています:

ここに画像の説明を入力してください

私の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ず、呼び出されません。なんで?私は何が欠けていますか?

ありがとうございました ;)

4

1 に答える 1

3

さらなる編集、最終的な解決:作成されviewDidLoadているDrawViewは、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 /ストーリーボードにUIViewを作成し、それをDrawViewに変換してdrawView、ViewController定義のフィールドをそのビューのアウトレットにしてみてください。またはb)ペン先から削除し、initWithFrameを使用してDrawViewを作成し、画面上の場所とサイズを指定します。

于 2012-09-18T00:31:42.917 に答える