2011-10-08 20 views
6

iPhoneアプリをiOS 5 GMで公開する準備をしていて、UIViewのバグを見つけました。サブクラスのdrawRectメソッドをオーバーライドすると、Simulatorは目的の結果を表示しますが、実際のデバイスでテストしようとすると、drawRectのオーバーライドには何の効果もありません。iOS 5 UIView drawRectオーバーライドがデバイス上で動作しない

私はさらに、drawRectのオーバーライド内にロギングステートメントを配置し、呼び出されていることを確認しました。

他に誰かがこの問題に気付いていますか?

はここでオーバーライドコードは、私が使用しています:

- (void)drawRect:(CGRect)rect { 
DebugLog(@"*** calling drawRect ***"); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

// draw the dark gray background 
CGContextSetFillColor(context, [SkinManager getWhiteColor]); 
CGContextFillRect(context, CGRectMake(0.0, 0.0, rect.size.width, rect.size.height)); 

// draw the text field background in white 
CGContextSetFillColor(context, [SkinManager getDarkGray]); 
CGContextFillRect(context, CGRectMake(2.0, 2.0, rect.size.width - 4, rect.size.height - 4)); 

}

をここで再び色

+(const CGFloat*) getDarkGray { 
     UIColor *color = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1]; 

     return [self getCGColor:color]; 
} 

+(const CGFloat*) getCGColor: (UIColor*)color { 
     CGColorRef colorref = [color CGColor]; 

     const CGFloat *components = CGColorGetComponents(colorref); 

     return components; 
} 

を生成するためのコードだ、このコードは、iOS 4.xで完璧に動作し、 iOS 5用Simulatorで壊れているのは、iOS 5 Deviceだけです。

+0

コードを投稿してください。iOSよりも問題がある可能性があります。なぜなら、本当にバグがあると他のユーザーも同じように遭遇してしまうからです。この分野のあらゆる問題)。 – DarkDust

+1

また、iOS 5はまだNDAの下にありますので、Dev-Forumに行きたいと思うかもしれません。 – Phlibbo

+0

私はdevフォーラムに質問を投稿しましたが、今まで誰も答えがありませんでした。 – Jay

答えて

0

コードでrectを使用する代わりに、self.boundsを使用してみてください。 Rectは、ビューの全体領域ではなく、リフレッシュが必要な領域です。

+0

私はself.boundsを使ってみましたが、何の違いもありませんでした。 – Jay

+1

drawRectがサブクラスにあり、カテゴリではないことは確かですか?カテゴリ内のオーバーライドは、すべてのバージョンのiOSでは常に機能するとは限りません。 – EricS

+0

はい、サブクラスです。実際にはサブクラスのサブクラスです。シミュレータが正しく動作するので、これはバグだと私は確信しています。 – Jay

0

iOS 5 drawRect:は、一部のオブジェクトにはありません。 UINavigationBar。このような状況では、新しいiOS 5スタイリングメソッドを条件付きで使用する必要があります。

This質問とthis質問が役に立ちます。

+1

そうではありません。あなたがサブクラスにいない限り、呼び出されないと言っているだけです。そして、OPは、これが適用されるビューのどれでもなく、「UIView」を参照しています。 – FeifanZ

2

使用[self setNeedsDisplay];

のdrawRectメソッドは、唯一の初期化時に呼び出されるので、それはあなたのオブジェクトが以前initedとされた場合は、それを「リフレッシュ」する必要があることを渡すことができます。

関連する問題