2009-07-12 12 views
0

独自のdrawRectメソッドを実装していて、コントローラクラスからシェイプを再描画しようとしていますが、UIViewを再描画するためにsetNeedsDisplayを正しく実装する方法がわかりません。助けてください!!iPhoneプログラミングsetNeedsDisplay not working

私はコードが醜いですが、ここでは独自の方法で知っている:

- (void)drawRect:(CGRect)rect{ 
// Drawing code 
NSArray *kyle = [self pointsForPolygonInRect:rect numberOfSides:[pshape numberOfSides]]; 
CGContextRef c = UIGraphicsGetCurrentContext(); 

int counter = [kyle count]; 
NSLog(@"counter: %d",counter); 
int i = 0; 
BOOL first = YES; 

NSValue *kylevalue; 
CGPoint thePoint; 
for (i = 0; i < counter; i++) { 
    kylevalue = [kyle objectAtIndex:i]; 
    thePoint = [kylevalue CGPointValue]; 
    if (first) { //start. 
     CGContextMoveToPoint(c, thePoint.x, thePoint.y+5.0); 
     first = NO; 
    } else { //do the rest 
     CGContextAddLineToPoint(c, thePoint.x, thePoint.y+5.0); 
    } 
} 
CGContextClosePath(c); //solid color 
CGContextDrawPath(c, kCGPathFillStroke);  

}

+0

混乱して申し訳ありません。私は別のクラスからビューをリフレッシュしようとしています。私が電話すると、私は電話します: [pview setNeedsDisplay]; 何も起こりません。私はそれを実行するとエラーは発生しませんが、どちらも応答しません。 –

答えて

1

私は私はあなたの質問を理解していません。ビュー上で-setNeedsDisplayを呼び出すと、-drawRect:メソッドによって再描画されます。

+0

混乱して申し訳ありません。別のクラスのビューをリフレッシュしようとしています。コールすると、[pview setNeedsDisplay];何も起こりません。私はそれを実行するとエラーは発生しませんが、どちらも応答しません。私はdrawRectに入ったときにNSLogメッセージを表示し、アプリケーションの起動時に一度しか入力しません。 –

+0

nilに送られたメッセージは暗黙のうちに無視されるので、pviewがnilでないことを確認する必要があります。 – titaniumdecoy

0

ほんの少しの考え 1.あなたのメソッドが呼び出されていることを確認しましたか? 2.実際にポイントの配列に複数のポイントが挿入されていることを確認しましたか? 3.実際にフレームの視認可能な領域にポイントがありますか? 4.ストロークの線幅、色または塗りつぶしの色を設定していません。

3

私は期待したとおりに動作しない再描画で同様の問題を抱えています。 setNeedsDisplayメソッドを呼び出す必要がある場合、setNeedsDisplayは子を再描画するよう強制しません。

私のニーズに合わせて、すべての単一ビューでsetNeedsDisplayを呼び出すことによって、画面全体を再描画するカテゴリを作成しました。これはもちろん、すべてのウィンドウではなく特定のビューから開始するように簡単に変更できます。これは誰か

0

に助けにある

@implementation UIApplication (Extensions) 

+ (void) redrawScreen { 
NSMutableSet* todo = [NSMutableSet set]; 
NSMutableSet* done = [NSMutableSet set]; 
[todo addObjectsFromArray:[[UIApplication sharedApplication] windows]]; 

while ([todo count] > 0) { 
    UIView* view = [todo anyObject]; 
    [view setNeedsDisplay]; 

    [done addObject:view]; 
    [todo removeObject:view]; 

    if (view.subviews) { 
    NSMutableSet* subviews = [NSMutableSet setWithArray:view.subviews]; 

    [subviews minusSet:done]; 
    [todo unionSet:subviews]; 
    } 
} 
} 

@end 

希望は時々理由は非常に単純なことができます。ファイルの所有者は、UIViewのオブジェクトに接続されていません。アウトレットが正しくセットアップされていない。 IB、ctrlボタンを使用してメソッドをドラッグします。

0

プロットにdrawRectメソッドがある場合、プロットに接続するコードでviewControllerを見てください。それは適切に接続されていますか?プロパティの空洞で小さな円ですか?プロパティが適切に接続されている場合は、その小さな円を記入する必要があります。中空の場合は、ストーリーボードを持ち上げてください。

ストーリーボードでプロットオブジェクトを探します。ストーリーボード内のプロットオブジェクトから、ビューコントローラー上の空の円までドラッグを制御します。今あなたはコンセントを接続しました。再度実行して、あなたのdrawRectが今呼び出されているかどうかを確認してください。