일모도원(日暮途遠) 개발자

[MacCatalyst] 마우스 커서 숨기기 본문

iOS개발/MacCatalyst

[MacCatalyst] 마우스 커서 숨기기

달님개발자 2022. 10. 5. 22:13

 

난 AppDelegate.swift안에 아래 코드를 두었다.

 

Timer를 하나 선언하고,  마우스 시간 변수(마우스가 안움직이고 5초지나면 마우스 사라지게할)를 선언하였다.

#if targetEnvironment(macCatalyst)
    // MacOs feature
    private var mouseTimer: Timer? 
    private var mouseTimeOut: Float = 5.0 // 5초가 지나면 마우스를 숨긴다.
#endif

 

동영상 플레이버튼을 누르면 disableAutoHideMouse함수를 호출한다.

if let app = UIApplication.shared.delegate as? AppDelegate {
    app.disableAutoHideMouse()
}

 

disableAutoHideMouse함수에서는 mouseTimer가 있으면 초기화하고, 위에서 정한 5초간격으로 hideMouse함수를 호출한다.

    func enableAutoHideMouse() {
#if targetEnvironment(macCatalyst)
        //마우스 타이머가 있으면 초기화한다.
        if mouseTimer != nil {
            mouseTimer!.invalidate()
            mouseTimer = nil
        }
        // 5초마다 hideMouse함수를 호출한다.
        mouseTimer = Timer.scheduledTimer(timeInterval: TimeInterval(mouseTimeOut), target: self, selector: #selector(hideMouse), userInfo: nil, repeats: true)
        logFor.DLog(message: "Enable mouse cursor event")
#endif
    }


    

hideMouse함수가 호출되면 CGEventSource.secondsSinceLastEventType로 마우스가 마지막으로 움직인 시간을 받아온다.(CGEventType.mouseMoved) 그리고 그게 5초보다 크면 NSCursor.setHiddenUntilMouseMoves(true)로 마우스를 숨긴다.

#if targetEnvironment(macCatalyst)
    @objc func hideMouse() {
        if Float(CGEventSource.secondsSinceLastEventType(CGEventSourceStateID.combinedSessionState, eventType: CGEventType.mouseMoved)) > mouseTimeOut {
            logFor.DLog(message: "Hide mouse cursor")
            NSCursor.setHiddenUntilMouseMoves(true)
        }
    }
#endif

 

동영상을 정지하거나 동영상뷰를 나가면 enableAutoHideMouse를 호출한다. 

if let app = UIApplication.shared.delegate as? AppDelegate {
    app.enableAutoHideMouse()
}

 

그럼 mouseTimer를 무효화시켜서 더이상 5초간격으로 hideMouse를 호출하지 못하도록 한다.

    func disableAutoHideMouse() {
#if targetEnvironment(macCatalyst)
        if mouseTimer != nil {
            mouseTimer!.invalidate()
            mouseTimer = nil
            logFor.DLog(message: "Disable mouse cursor event")
        }
#endif
    }