Я прочитал эту ветку о пользовательских окнах в iOS. Вот оно, я создаю новое окно и показываю его через window.hidden = NO;
над ключевым окном, конечная цель - сделать пользовательское окно прозрачным, а btnAction
внутри него может принимать события.
Если я установлю для userInteractionEnabled
окна значение NO
, все события, отправляемые в его подпредставления, перейдут к следующему окну более низкого уровня (это ключевое окно здесь). Если я отключу строку userInteractionEnabled
и оставлю ее по умолчанию YES
, пользовательское окно будет подавлять все события с do nothing
в прозрачной области, но btnAction
получит ожидаемое событие.
Я знаю, что есть способ разрешить пользовательскому окну обходить события из указанной прозрачной области, просто наследуйте UIWindow
, чтобы создать новое окно подкласса, и переопределите эти методы для достижения этого.
// From UIView.h
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds
Мне просто интересно, есть ли другие быстрые простые способы исправить это без наследования?
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
window.windowLevel = UIWindowLevelNormal + 1;
window.userInteractionEnabled = NO; // This will block the events which send to `btnAction`, too.
// window.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.4];
window.backgroundColor = UIColor.clearColor;
UIButton *btnAction = [UIButton new];
[btnAction setBackgroundImage:UIImageFromColor(RandomColor) forState:UIControlStateNormal];
[btnAction addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
[window addSubview:btnAction];
[btnAction mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.equalTo(@60);
make.right.equalTo(window).offset(-20);
make.bottom.equalTo(window).offset(-60);
}];