DEV Community

Eon
Eon

Posted on

ForceTouch in macOS

Here are some handy snippets when dealing with ForceTouch in macOS:

img

Event handler:

var prevStage = 0
override func pressureChange(with event: NSEvent) {
    let curStage:Int = event.stage
    if event.pressureBehavior == NSPressureBehavior.primaryDeepClick,prevStage != curStage {
        switch (curStage,prevStage){
            case (0,1):
                Swift.print("from idle to clickStage")
            case (1,0):
                Swift.print("from clickStage to idle")
            case (1,2):
                Swift.print("from clickStage to deepClickStage")
            case (2,1):
                Swift.print("from deepStage to clickStage")
            default: break;//isn't possible
        }
        Swift.print("stageChange")
        prevStage = curStage/*always set prevStage to curStage on stage change*/
    }
    Swift.print("pressureChange")
}
Enter fullscreen mode Exit fullscreen mode

Normalize the pressure:

/**
 * NOTE: calculates the entire range of the stage pressures so from stage 0 to 1 the pressure goes from 0 to 0.5 and from stage 1 to 2 the linear pressure goes from 0.5 to 1 this makes it easier to scale things in a linear fashion from 0 to 1 in the entire stage range
 */
var linearPressure:CGFloat{
    if event.stage == 0 {
        return 0
    }else if event.stage == 1{
        return pressure / 2
    }else /*if stage == 2*/ {
        return 0.5 + (pressure / 2)
    }
}
Enter fullscreen mode Exit fullscreen mode

UI provided by https://github.com/eonist/Element

Top comments (0)