所以我知道有很多关于这个的问题,但据我所知,这是一个独特的情况,所以我想我会发布它。希望这将添加一些信息,最终可能会给我们一个答案,说明为什么会发生这种情况。我收到错误: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];
}