iOS: как добавить плавающую кнопку в новом неключевом пользовательском окне? - PullRequest
0 голосов
/ 30 октября 2018

Я прочитал эту ветку о пользовательских окнах в 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);
    }];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...