Я знаю, что по этому поводу есть много вопросов, но насколько я могу судить, это уникальная ситуация, поэтому я решил, что опубликую ее. Надеюсь, это добавит некоторую информацию, которая, наконец, может дать нам ответ, почему это происходит с нами. Я получаю сообщение об ошибке: wait_fences: не удалось получить ответ: 10004003, когда мое устройство вращается. Анимация моих представлений инициируется:
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Я получаю сообщение об ошибке только на новом iPad 3. Я использовал ту же программу на оригинальном iPad и iPhone, начиная с 3GS. Все они не получают ошибку 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];
}