Skip to content

Releases: maustinstar/swiftui-drawer

Landscape

21 Aug 16:16
e18f1f4
Compare
Choose a tag to compare

Landscape!

Check out the new .onLayoutForSizeClass modifier!

With .onLayoutForSizeClass you can update your state variables to layout your drawer for landscape.

Resting heights are now binding!

This means you can keep a state variable to contain your view heights. Instead of using the old .locked modifier, just change the resting heights parameter to a single height.

New Documentation Layout

The Readme is more concise, but it now contains links to other markdown files for Examples and Reference.

[Beta] Landscape

18 Jul 21:17
3a98452
Compare
Choose a tag to compare
[Beta] Landscape Pre-release
Pre-release

[Beta] Landscape

Introducing behaviors for landscape and split view orientations

New View Modifiers

Alignment

Defines the horizontal alignment for the drawer. The default is fullscreen.

public enum DrawerAlignment {
    case leading, center, trailing, fullscreen
}

Usage

Drawer(heights: [100, 340]) {
    Color.blue
}
.width(.constant(340))
.alignment($alignment)

Width

Defines a width for the drawer when not in fullscreen alignment.

Usage

Drawer(heights: [100, 340]) {
    Color.blue
}.width(.constant(340))

OnLayoutForSizeClass

A callback to receive updates when the drawer is laid out for a new size class.

This closure is executed every time the device layout changes (portrait, landscape, and split view).
Use this to modify your view when the drawer's layout changes.

Usage
Alter the resting heights and alignment when the screen layout changes.

Drawer(heights: [100, 340]) {
    Color.blue
}
.onLayoutForSizeClass { (sizeClass) in
    switch (sizeClass.horizontal, sizeClass.vertical) {
    case (.compact, .compact):
        // smaller iPhone landscape
        break
    case (.compact, .regular):
        // iPhone portrait
        // iPad portrait splitview
        // iPad landscape smaller splitview
        break
    case (.regular, .compact):
        // larger iPhone landscape
        break
    case (.regular, .regular):
        // iPad fullscreen
        // iPad landscape larger splitview
        break
    default:
        // Unknown layout
        break
    }
}

Declarative View Modifiers

16 Jul 17:55
9799c35
Compare
Choose a tag to compare

🥳 New Declarative View Modifiers!

Thank you for all your support and feature requests!

New declarative view modifiers will help you customize the drawer experience. Shoutout to u/pupdogg007 for my favorite requested feature: locking the drawer.

I also spent a lot of time refining the fluidity of the drawer animations. In v0.0.2, I made the drags more responsive by toggling animation. In v0.03, after formulating a function on Desmos, I am introducing 'springiness' to the drawers when they are pulled beyond their boundaries. This animation feels more fluid by asymptotically reducing the influence of a drag.

🔒 Locked

Locks the drawer in a controlled position. When set to true, the drawer will animate into the locked height.

Lock into the current resting height

/*Drawer*/.locked($locked) { (currentPosition) in
    return currentPosition
}

🪀 Spring

Sets the springiness of the drawer when pulled past boundaries.

The user's drag displacement is transformed by a logistic curve for a natural hard-spring pull that reaches an asymptote.

/*Drawer*/.spring(20)

😴 OnRest

A callback to receive updates when the drawer reaches a new resting level. This closure is executed every time the drawer reaches a new resting hieght. Use this when you want to receive updates on the drawer's changes.

/*Drawer*/.onRest { (restingHeight) in
    print(restingHeight)
}

💥 Impact

Sets the haptic impact of the drawer when resting

/*Drawer*/.impact(.light)

Other Notes

Deprecated the init's impact parameter to prefer the declarative modifier.

Animation & Haptics

14 Jul 22:38
Compare
Choose a tag to compare

Edited Animation

The animation is now disabled when dragging for increased responsiveness, and the release animation is now a spring.

New Haptics

Haptic impact can be defined when the drawer reaches a resting height, using a UIImpactFeedbackGenerator.

Initial Release

14 Jul 20:50
afb34da
Compare
Choose a tag to compare
v0.0.0

Update README.md