Подтвердить что ты не робот

Неожиданное окно 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 = >

Что означает это сообщение и как я могу его исправить, чтобы отслеживание правильного края было обнаружено последовательно?

4b9b3361

Ответ 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

Возможно, поздно, но некоторые люди могут все еще нуждаться в этом, обычно причина в том, что вы не предоставили изображения с правильным размером изображения или экран запуска, и/или главный интерфейс не установлен в вашу собственную раскадровку в разделе "Общие сведения" > "Сведения о развертывании"