Неожиданное окно nil в _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow
Я пытаюсь настроить жестовый саблей в iOS 8 на iPad, но получаю и ошибки, которые кажутся ошибкой.
У меня есть следующий код:
UIScreenEdgePanGestureRecognizer *edgeRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightEdgeSwipe:)];
edgeRecognizer.edges = UIRectEdgeRight;
[self.view addGestureRecognizer:edgeRecognizer];
а затем я обрабатываю жест:
-(void)handleRightEdgeSwipe:(UIGestureRecognizer*)sender
{
//slide in view code here
}
Проблема заключается в том, что он не обнаруживает, что правый край прокручивается каждый раз. И иногда он обнаруживает его несколько раз.
Независимо от того, обнаруживает он или нет, он всегда отображает следующую информацию на консоли при прокрутке правого края iPad:
2014-10-07 00: 04: 40.386 Office Log [1531: 500896] неожиданное окно nil в _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow:; layer = >
Что означает это сообщение и как я могу его исправить, чтобы отслеживание правильного края было обнаружено последовательно?
Ответы
Ответ 1
Я думаю, что это ошибка в iOS, которую я могу подтвердить на iPad mini 2 и iPad Air на iOS 7 или выше, даже на главном экране.
В "Пейзаж слева" (кнопка "Дом" слева) "Небо справа" не работает для меня. Проверьте его самостоятельно на главном экране.
Я сообщил об ошибке Apple 9 Месяцев назад, но отметив, что это произошло.
Обновление:
Я немного поиграл с UIWindow init, и когда он немного больше, чем на самом деле, Жест работает. Конечно, это ужасное решение.
self.window = [UIWindow new];
self.window.rootViewController = [[UIViewController alloc] init];
// Real Size
CGRect frame = [UIScreen mainScreen].bounds;
// Real Size + 0.000001
self.window.frame = CGRectMake(0, 0, frame.size.width+0.000001, frame.size.height+0.000001);
[self.window makeKeyAndVisible];
Ответ 2
У меня такая же проблема.
Мое решение прекрасно работает: просто установите в свой xib свою Windows для скрытия.
Я действительно не понимаю, почему он работает, но он работает.
РЕДАКТИРОВАТЬ 1:
Я нашел другое решение, лучше, я думаю, и более понятно:
Поместите этот код в свой файл willFinishLaunchingWithOptions в приложении appDelegate:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CGRect bounds = [[UIScreen mainScreen] bounds];
[self.window setFrame:bounds];
[self.window setBounds:bounds];
return YES;
}
Затем, на вашем didFinishLaunchingWithOptions:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Your codes...
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
Затем вы можете скрыть свой оконный объект к НЕТ, и он должен работать.
Ответ 3
У меня возникла проблема при тестировании iPhone-приложения на iPad. Никаких проблем с симулятором и никаких проблем, если я буду компилировать приложение как универсальное и работать на iPad.
unexpected nil window in _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: <UIClassicWindow: 0x1276065a0; frame = (0 0; 768 1024); userInteractionEnabled = NO; gestureRecognizers = <NSArray: 0x1740557e0>; layer = <UIWindowLayer: 0x17403fd80>>
Возможно, кадр ошибочен? (frame = (0 0; 768 1024))
Ответ 4
В iOS 8 есть ошибка, при которой любое касание, которое начинается точно на правом правом краю iPad, когда в режиме "Портрет вверх-вниз" (главная кнопка сверху) или "Пейзаж слева" (кнопка "Дом слева" ) не может быть проверен на правильное представление.
Исправление заключается в подклассе UIWindow
, чтобы правильно проверить правильную сторону.
@implementation FixedWindow
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView* hit = [super hitTest:point withEvent:event];
if (!hit && point.x >= CGRectGetMaxX(self.bounds))
hit = [super hitTest:CGPointMake(point.x - 0.5, point.y) withEvent:event];
return hit;
}
@end
Прикрепите окно к делегату приложения через свойство window
.
@implementation AppDelegate
- (UIWindow*)window
{
if (!_window)
_window = [[IVWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
return _window;
}
@end
В режимах "Портрет" и "Пейзаж" я подтвердил, что касания правого края всегда не менее 0.5px от края, а не от края, поэтому это исправление должно работать аналогично этому.
Расширение рамки окна
Обратите внимание, что исправление firebug также будет работать, то есть слегка расширяя оконный фрейм, чтобы включить правую сторону. Однако:
- Если вы сделаете это в
application:willFinishLaunchingWithOptions:
или application:didFinishLaunchingWithOptions:
, ваша иерархия представлений не будет изменена к новому кадру, а касания правого края не будут проходить через иерархию.
- Если вы поворачиваете устройство, окно может быть не правильно центрировано. Это приводит к незначительному размазыванию или удалению элементов интерфейса.
iOS 7:
iOS 7 имеет аналогичную ошибку в том, что тест на попадание также терпит неудачу, но с не-нулевым результатом и невращающейся геометрией. Это исправление должно работать как с iOS 7, так и с 8:
@implementation FixedWindow
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView* hit = [super hitTest:point withEvent:event];
if (!hit || hit == self)
{
CGRect bounds = self.bounds;
hit = [super hitTest:CGPointMake(MIN(MAX(point.x, CGRectGetMinX(bounds) + 0.5), CGRectGetMaxX(bounds) - 0.5),
MIN(MAX(point.y, CGRectGetMinY(bounds) + 0.5), CGRectGetMaxY(bounds) - 0.5))
withEvent:event];
}
return hit;
}
@end
Ответ 5
Одно из возможных исправлений - удалить или прокомментировать код для скрытия строки состояния, если у вас есть это.
Я тянул свои волосы, чтобы решить эту проблему, и я мог только воспроизвести ее на моем корневом представлении. Похоже, что если вы скрываете строку состояния, вы не можете перетаскивать сегодня виджеты/центр уведомлений (вы можете с некоторым усилием).
/* <- add this
- (BOOL)prefersStatusBarHidden
{
return YES;
}
add this -> */
Ответ 6
Установите развертывание на 8.x или выше, установите стартовый экран в качестве основного xib.
Готово!
Ответ 7
Возможно, поздно, но некоторые люди могут все еще нуждаться в этом,
обычно причина в том, что вы не предоставили изображения с правильным размером изображения или экран запуска, и/или главный интерфейс не установлен в вашу собственную раскадровку в разделе "Общие сведения" > "Сведения о развертывании"