Jadi saya tahu ada banyak pertanyaan mengenai hal ini, tapi sejauh yang saya tahu ini adalah situasi yang unik jadi saya pikir saya akan mempostingnya. Semoga dapat menambah beberapa info yang pada akhirnya dapat memberikan kita jawaban mengapa hal ini terjadi pada kita. Saya mendapatkan pesan kesalahan: wait_fences: gagal menerima balasan: 10004003, saat perangkat saya berputar. Animasi pandangan saya dimulai dari:
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Saya hanya mendapatkan kesalahan pada iPad 3 baru. Saya telah menggunakan program yang sama persis pada iPad asli dan iPhone serendah 3GS. Mereka semua tidak mendapatkan kesalahan wait_fences dan semuanya berputar lebih cepat daripada iPad 3.
Saya menggunakan Core Graphics hampir secara eksklusif untuk menggambar tampilan. Saya juga memastikan gambar tersebut digambar ulang dan diubah ukurannya sehingga saya tidak mendapatkan tampilan yang kacau. Jika saya menonaktifkan gambar ulang saat mengubah ukuran, saya tidak mendapatkan kesalahan ini (tetapi saya mendapatkan tampilan yang melebar). Jika saya menonaktifkan gambar grafik inti sama sekali, saya tidak mendapatkan kesalahan (tetapi, tentu saja, saya mendapatkan tampilan hitam).
Saya menggunakan Time Profiler dan menemukan bahwa hangup terutama terjadi pada gradien gambar:
Saya telah mengubah kode untuk mengisi daripada menggambar gradien dan itu meringankan masalah. Saya akan mengatakan bahwa gradien adalah masalahnya kecuali saya melakukan animasi ini dalam situasi lain (selain sebagai respons terhadap rotasi) dan itu berfungsi dengan baik.
Saya juga ingin mencatat bahwa saya memberikan perhatian khusus untuk memastikan saya hanya menganimasikan tampilan yang benar-benar ada di layar. Saya tahu bahwa menganimasikan tampilan di luar layar terkadang dapat menyebabkan kesalahan ini terjadi.
Saya belum menyertakan kode animasinya
Adakah gagasan mengapa hal ini terjadi? Apalagi ini hanya terjadi di iPad 3?
Bagi yang bertanya, inilah kode yang menjalankan animasinya. Biasanya akan dibungkus dalam Blok Animasi 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];
}