У меня на экране два UIWindows и один за другим. есть ли способ обработать прикосновение пользователя к окну, которое находится позади?
Спасибо
У меня на экране два UIWindows и один за другим. есть ли способ обработать прикосновение пользователя к окну, которое находится позади?
Спасибо
Вы должны просто отключить его, как и любой UIView.
UIWindow *secondWindow = [[UIWindow alloc] initWithFrame:<#frame#>];
[secondWindow setUserInteractionEnabled:NO];
iOS по умолчанию сначала смотрит, к какому окну прикоснулись, если в сенсорной области находится несколько окон, она выбирает верхнее (на основе уровня окна, индекса z)
затем он вызовет hitTest(_ point: CGPoint, with event: UIEvent) -> UIView?
в окне, которое, по мнению ОС, было затронуто.
Если ваши представления в этом окне могут вернуть nil (в этом окне нельзя коснуться представления или вы переопределили hitTest), тогда окно вернет его само.
Чтобы решить эту проблему, вам нужно создать подкласс UIWindow
и переопределить функцию hitTest. Если представление, возвращенное из super.hitTest_:with:)
, равно нулю или self // the window
, вы можете делегировать его другому окну. Обратите внимание на тот факт, что окно, к которому вы прикоснулись, может иметь другое координатное пространство, чем окно, которому вы делегируете полномочия.
Пример:
internal final class CustomWindow: UIWindow {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if let view = super.hitTest(point, with: event), view != self {
return view
}
guard let keyWindow = UIApplication.shared.keyWindow else {
return nil
}
return keyWindow.hitTest(keyWindow.convert(point, from: self), with: event)
}
}
Спасибо, но я только что нашел способ:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
for (UIWindow *win in [[UIApplication sharedApplication] windows]) {
if (win.tag != self.tag) {
return [win hitTest:point withEvent:event];
}
}
return nil;
}
Вы сможете принимать сенсорные события только на одном UIWindow
за раз. UIWindow
, который принимает события, называется keyWindow
.
[behindWindow makeKeyAndVisible];
Ваш передний план UIWindow
останется видимым, но ваш behindWindow
будет получать события.
UIWindow
за раз.
- person Ian MacDonald; 07.10.2016