これに関して多くの質問があることは承知していますが、私が知る限り、これはユニークな状況なので、投稿することにしました. うまくいけば、これがなぜこれが私たちに起こっているのかについての答えを最終的に与えるかもしれないいくつかの情報を追加する. デバイスが回転すると、エラー: wait_fences: failed to receive reply: 10004003 が表示されます。ビューのアニメーションは次から開始されます。
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
新しい iPad 3 でのみエラーが発生します。元の iPad と 3GS までの iPhone でまったく同じプログラムを使用しました。それらはすべて wait_fences エラーを取得せず、iPad 3 よりも高速に回転します。
ビューを描画するために、ほぼ独占的に Core Graphics を使用しています。また、サイズ変更時に再描画されるようにして、頭がおかしくなったビューが表示されないようにします。サイズ変更時に再描画を無効にすると、このエラーは発生しません (ただし、ビューが引き伸ばされます)。コア グラフィック描画を完全に無効にすると、エラーは発生しません (ただし、もちろん、黒いビューが表示されます)。
Time Profiler を使用したところ、ハングアップは主にグラデーションの描画にあることがわかりました。
グラデーションを描画するのではなく、塗りつぶすようにコードを変更しました。これにより、問題が軽減されます。これらのアニメーションを他の状況 (回転に反応する場合以外) で行うことを除いて、グラデーションが問題であると言えますが、それは問題なく機能します。
また、実際に画面に表示されているビューのみをアニメーション化するように特に注意を払っていることにも注意してください。画面外のビューをアニメーション化すると、このエラーが発生することがあります。
アニメーションコードを含めていません
なぜこれが起こっているのかについてのアイデアはありますか? 特にiPad 3でしか起きていないので?
質問する人のために、これはアニメーションを実行するコードです。通常、UIView アニメーション ブロックにラップされます。
- (void) setFramesForFocusView:(CustomControl *)focusView atX:(CGFloat)x showInput:(BOOL)showInput{
CGSize bSize = self.bounds.size;
CGRect fRect = focusView.frame;
fRect.size.width = bSize.width;
CGRect iRect;
if (focusView.inputViewIsSystemKeyboard){
if (_keyboardRect.origin.y < 0 || _keyboardRect.origin.y >= CGRectGetMaxY(self.bounds) || CGRectIsEmpty(_keyboardRect) || CGRectGetMaxY(_keyboardRect) > CGRectGetMaxY(self.bounds)) return;
iRect = _keyboardRect;
} else {
iRect = (focusView.inputUIView && showInput) ? CGRectMake(0, bSize.height / 2, bSize.width, bSize.height / 2) : CGRectZero;
}
CGRect iaRect = focusView.inputAccessoryUIView.frame;
CGFloat availableFieldHeight = iRect.origin.y - iaRect.size.height;
iRect.size.width = bSize.width;
iaRect.size.width = bSize.width;
if (!showInput){
iRect.origin.y = bSize.height;
}
iaRect.origin.y = iRect.origin.y - iaRect.size.height;
iRect.origin.x = x;
iaRect.origin.x = x;
focusView.inputUIView.frame = iRect;
focusView.inputAccessoryUIView.frame = iaRect;
if (focusView.expandInput){
fRect.origin.y = 0;
fRect.size.height = availableFieldHeight;
} else {
if (focusView.labelPlacement != LabelPlacementTop && focusView.labelPlacement != LabelPlacementBottom){
fRect.size.height = _currentView.storedFrame.size.height + [focusView.label.text sizeWithFont:focusView.label.font].height;
}
fRect.origin.y = availableFieldHeight - fRect.size.height;
}
if (fRect.size.height > availableFieldHeight){
fRect.origin.y = 0;
fRect.size.height = availableFieldHeight;
}
fRect.origin.x = x;
[focusView setLabelPlacement:LabelPlacementTop toFrame:fRect];
}