Rideau is a drawer UI similar to what Apple's apps use. (e.g Maps, Shortcuts)
- π Supports multiple snap points (e.g. most hidden, half visible, full visible, and we can add more snap points.)
- π Supports Animations alongside moving (e.g. dimming background color)
- π Supports handling scrolling of scrollview inside RideauView
- π Supports resizing based on intrinsic content size of view that RideauView has
- β Interactive Animations come from UIViewPropertyAnimator, with this it's actual interruptible animation and no glitches. (it can't get from UIView.animate)
RideauView allows for flexible snap points.
Snap points pertains to specified offsets where the draggable view "snaps to" when the dragging has ended.
There are usually 2 or 3 snap points.
Objects we will commonly use:
- RideauView
- RideauViewController
- RideauSnapPoint
RideauView is the core object in this library.
We typically add our own view to RideauView.
RideauViewController contains a RideauView.
It allows us to present the RideauView as modal dialog.
RideauSnapPoint defines where the content view stops.
iOS 10.0+ Xcode 13+ Swift 5.5+
- Multiple snap-point
- Smooth integration with dragging and UIScrollView's scrolling.
- Tracking UIScrollView automatically
- Set UIScrollView to track manually
- Use UIViewPropertyAnimator between snap-points.
let rideauView = RideauView(
frame: .zero,
configuration: .init { config in
config.snapPoints = [.autoPointsFromBottom, .fraction(0.6), .fraction(1)]
}
)
let someView: UIView = ...
rideauView.containerView.set(
bodyView: someView,
resizingOption: .resizeToVisibleArea
)let targetViewController: YourViewController = ...
let controller = RideauViewController(
bodyViewController: targetViewController,
configuration: .init { config in
config.snapPoints = [.autoPointsFromBottom, .fraction(1)]
},
initialSnapPoint: .autoPointsFromBottom,
resizingOption: .resizeToVisibleArea
)
present(controller, animated: true, completion: nil)We can define snap-point with RideauSnapPoint.
public enum RideauSnapPoint: Hashable {
case fraction(CGFloat)
case pointsFromTop(CGFloat)
case pointsFromBottom(CGFloat)
case autoPointsFromBottom
case hidden
public static let full: RideauSnapPoint = .fraction(1)
}config.snapPoints = [.pointsFromBottom(200), .fraction(0.5), .fraction(0.8), .fraction(1)]RideauContentContainerView has two ways of resizing the content view that is added.
RideauContentContainerView.ResizingOptionnoResizeresizeToVisibleArea
public final class RideauContentContainerView: UIView {
public func set(bodyView: UIView, resizingOption: ResizingOption)
}Rideau provides the following components that may help us.
A Container view controller that implements masked rounded corner interface and has some options.
- More customizable
let targetViewController: YourViewController = ...
let controller = RideauViewController(
bodyViewController: RideauMaskedCornerRoundedViewController(viewController: targetViewController),
configuration: .init { config in
config.snapPoints = [.autoPointsFromBottom, .fraction(1)]
},
initialSnapPoint: .autoPointsFromBottom,
resizingOption: .resizeToVisibleArea
)- More customizable
- More customizable
Rideau is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'Rideau'For Carthage, add the following to your Cartfile:
github "muukii/Rideau"
https://github.com/nerdsupremacist/Snap
Rideau is released under the MIT license.


