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

Передача штрихов между сложными UIWindows?

У меня есть два окна - передний и задний. Передняя часть используется для наложения некоторого материала поверх спины. Я хочу иметь возможность фиксировать штрихи на некоторых частях переднего окна, но не на других; Я хочу, чтобы переднее окно получало штрихи в некоторых областях, но передавайте их в обратное окно в других.

Любые идеи относительно того, как я это сделаю?

4b9b3361

Ответ 1

Хорошо, вот что я сделал: я создал два вида в переднем окне. Первый вид охватил область, где я хотел поймать прикосновения; второй, где я хотел, чтобы штрихи проходили. Я подклассифицировал UIWindow и переопределил метод hitTest: withEvent следующим образом:

- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {

  // See if the hit is anywhere in our view hierarchy
  UIView *hitTestResult = [super hitTest:point withEvent:event];

  // ABKSlideupHostOverlay view covers the pass-through touch area.  It recognized
  // by class, here, because the window doesn't have a pointer to the actual view object.
  if ([hitTestResult isKindOfClass:[ABKSlideupHostOverlayView class]]) {

    // Returning nil means this window hierachy doesn't handle this event. Consequently,
    // the event will be passed to the host window.
    return nil;
  }

  return hitTestResult;
}

И в классе, который создает переднее окно, я использовал распознаватель жестов, чтобы поймать штрихи на первом представлении.


То же самое в коде 2017 года:

class PassView: UIView {}

class UIHigherWindow: UIWindow {

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let hitView = super.hitTest(point, with: event)

        if hitView!.isKind(of: PassView.self) {

            return nil
        }

        return hitView
    }
}

В вашем окне "uber" будет некоторый контроллер просмотра, UberVc.

Просто сделайте основной вид (то есть просто фон .view) UberVc - это PassView.

Затем добавьте кнопки say и т.д. на UberVc.

Приведенный выше код приводит к любым щелчкам на кнопках, идущих на UberVc, и любые клики, не входящие в кнопки (т.е. на "фон" ), переходят в ваше обычное окно/VC.

Ответ 2

У меня была аналогичная проблема: дополнительный UIWindow должен иметь прозрачный вид на нем с некоторыми трудноразрешимыми subview. Все штрихи вне этих трудноразрешимых взглядов должны быть пройдены.

В итоге я использовал модифицированную версию кода Anna, в которой вместо проверки типа используется тег view. Такой способ создания подкласса не требуется:

class PassTroughWindow: UIWindow {
    var passTroughTag: Int?

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let hitView = super.hitTest(point, with: event)

        if let passTroughTag = passTroughTag {
            if passTroughTag == hitView?.tag {
                return nil
            }
        }
        return hitView
    }
}

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

let window: PassTroughWindow 
//Create or obtain window

let passTroughTag = 42

window.rootViewController.view.tag = passTroughTag
window.passTroughTag = passTroughTag

//Or with a view:
let untouchableView: UIView // Create it
untouchableView.tag = passTroughTag
window.addSubview(untouchableView)

Ответ 3

Вместо использования нескольких UIWindows получите ключевое окно с [[UIApplication sharedApplication] keyWindow], затем добавьте к нему свое представление:

mainWindow = [[UIApplication sharedApplication] keyWindow];
[mainWindow addSubview:view]