ฉันรู้ว่ามีคำถามมากมายเกี่ยวกับเรื่องนี้ แต่เท่าที่ฉันสามารถบอกได้ว่านี่เป็นสถานการณ์ที่ไม่เหมือนใคร ฉันก็เลยคิดว่าจะโพสต์มัน หวังว่านี่จะเป็นการเพิ่มข้อมูลที่อาจให้คำตอบว่าทำไมสิ่งนี้ถึงเกิดขึ้นกับเราในที่สุด ฉันได้รับข้อผิดพลาด: wait_fences: failed to gets Reply: 10004003 เมื่ออุปกรณ์ของฉันหมุน ภาพเคลื่อนไหวของมุมมองของฉันเริ่มต้นจาก:
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
ฉันเพิ่งได้รับข้อผิดพลาดบน iPad 3 ใหม่ ฉันใช้โปรแกรมเดียวกันนี้กับ iPad และ iPhone รุ่นดั้งเดิมที่มีความเร็วต่ำถึง 3GS พวกเขาทั้งหมดไม่ได้รับข้อผิดพลาด wait_fences และทั้งหมดหมุนได้เร็วกว่าที่ iPad 3 ทำ
ฉันใช้ Core Graphics เกือบทั้งหมดเพื่อวาดมุมมอง ฉันยังตรวจสอบให้แน่ใจว่าพวกเขาถูกวาดใหม่ตามการปรับขนาด ดังนั้นฉันจึงไม่ได้รับมุมมองที่เป็นพิกเซล หากฉันปิดใช้งานการวาดใหม่เมื่อปรับขนาด ฉันจะไม่ได้รับข้อผิดพลาดนี้ (แต่ฉันได้รับมุมมองที่ขยาย) หากฉันปิดใช้งานการวาดภาพกราฟิกหลักโดยสิ้นเชิง ฉันจะไม่ได้รับข้อผิดพลาด (แต่แน่นอนว่า ฉันได้รับมุมมองสีดำ)
ฉันใช้ Time Profiler และพบว่าการวางสายนั้นเกิดจากการไล่ระดับสีเป็นหลัก:
ฉันได้แก้ไขโค้ดให้เติมแทนที่จะวาดการไล่ระดับสี และนั่นจะช่วยบรรเทาปัญหาได้ ฉันจะบอกว่าการไล่ระดับสีเป็นปัญหายกเว้นฉันทำแอนิเมชั่นเหล่านี้ในสถานการณ์อื่น (นอกเหนือจากการตอบสนองต่อการหมุน) และมันก็ใช้ได้ดี
ฉันอยากจะทราบด้วยว่าฉันได้ให้ความสนใจเป็นพิเศษเพื่อให้แน่ใจว่าฉันจะเคลื่อนไหวเฉพาะมุมมองที่อยู่บนหน้าจอเท่านั้น ฉันรู้ว่าบางครั้งการแสดงภาพเคลื่อนไหวนอกหน้าจออาจทำให้เกิดข้อผิดพลาดนี้ได้
ฉันยังไม่ได้รวมโค้ดภาพเคลื่อนไหว
มีความคิดใด ๆ ว่าทำไมสิ่งนี้ถึงเกิดขึ้น? โดยเฉพาะอย่างยิ่งเมื่อมันเกิดขึ้นบน iPad 3 เท่านั้น?
สำหรับผู้ที่จะถาม นี่คือโค้ดที่ใช้สร้างแอนิเมชัน โดยปกติแล้วจะถูกรวมไว้ใน UIView Animation Block
- (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];
}