- Notifications
You must be signed in to change notification settings - Fork205
HWPanModal presents controller from bottom and drag to dismiss, high customize. iOS13 default modalPresentationStyle. 任意形式的底部弹框动画;头条、知乎、抖音弹出评论效果;地图浮层,iOS13 present默认模态效果。
License
HeathWang/HWPanModal
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
HWPanModal is used to present controller and drag to dismiss. Similar with iOS13 default present Modal style.
Inspired byPanModal, thanks.
My another project for pop controller:HWPopController
- Supports any type of
UIViewControllerto present. - Support View which inherit from
HWPanModalContentViewto present. - Seamless transition between modal and content.
- Support two kinds of dismissal gestureRecognizer interaction
- Pan gesture direction up&down
- Pan gesture direction right, you can swipe on screen edge to dismiss controller.
- Support write your own animation for presenting VC.
- Support config animation
Duration,AnimationOptions,springDamping. - Support config background alpha or
blurbackground. Note: Dynamic change blur effect ONLY works on iOS9.0+. - Show / hide corner, indicator.
- Auto handle UIKeyboard show/hide.
- Hight customize indicator view.
- Touch event response can pass through to presenting VC.
- Config presented view shadow style.
More config pls seeHWPanModalPresentable.h declare.
From version 0.6.0, this framework support usingHWPanModalContentView to present from bottom, that means we can add subview(inherit fromHWPanModalContentView) to the target view that you want to show.
The different isHWPanModalContentView is just a view, and support some animations, unlike present ViewController, you will got ViewController life circle, and navigation stack.
HWPanModalContentView limit:
- Currently not support screen rotation.
- Not support edge horizontal pan to dismiss.
- Not support customize presentingVC animation. (There is no presentingVC for view).
- Handle keyboard show&dismiss.
- High customize indicator view.
- Edge Interactive dismissal can work on full screen and configable distance to left edge.
- Touch event can response to presenting VC, working on it.
- Strip the presented view container view, make it can use directly.
iOS 8.0+, support Objective-C & Swift.
pod'HWPanModal','~> 0.9.9'
Your UIViewController need to conformHWPanModalPresentable. If you use default, nothing more will be written.
#import<HWPanModal/HWPanModal.h>@interfaceHWBaseViewController () <HWPanModalPresentable>@end@implementationHWBaseViewController- (void)viewDidLoad { [superviewDidLoad];// Do any additional setup after loading the view.}#pragma mark - HWPanModalPresentable- (PanModalHeight)longFormHeight {returnPanModalHeightMake(PanModalHeightTypeMaxTopInset,44);}@end
Where you need to present this Controller.
#import<HWPanModal/HWPanModal.h>[selfpresentPanModal:[HWBaseViewControllernew]];
yeah! Easy.
When You present you Controller, you can change the UI.Refer toUIViewController+Presentation.h.
- Change the state between short and long form. call
- (void)hw_panModalTransitionTo:(PresentationState)state; - Change ScrollView ContentOffset. call
- (void)hw_panModalSetContentOffset:(CGPoint)offset; - Reload layout. call
- (void)hw_panModalSetNeedsLayoutUpdate;- Note: When your scrollable changed it's contentSize, youMUST reload the layout.
Some guys want to animate Presenting VC when present/dismiss.
Create object conforms
HWPresentingViewControllerAnimatedTransitioning.@interfaceHWMyCustomAnimation :NSObject <HWPresentingViewControllerAnimatedTransitioning>@end@implementationHWMyCustomAnimation- (void)presentAnimateTransition:(id<HWPresentingViewControllerContextTransitioning>)transitionContext {NSTimeInterval duration = [transitionContexttransitionDuration]; UIViewController *fromVC = [transitionContextviewControllerForKey:UITransitionContextFromViewControllerKey];// replace it. [UIViewanimateWithDuration:durationdelay:0usingSpringWithDamping:0.8initialSpringVelocity:0options:UIViewAnimationOptionCurveEaseInOutanimations:^{ fromVC.view.transform =CGAffineTransformMakeScale(0.95,0.95); }completion:^(BOOL finished) { }];}- (void)dismissAnimateTransition:(id<HWPresentingViewControllerContextTransitioning>)transitionContext {// no need for using animating block. UIViewController *toVC = [contextviewControllerForKey:UITransitionContextToViewControllerKey]; toVC.view.transform = CGAffineTransformIdentity;}@end
Overwrite below two method.
- (PresentingViewControllerAnimationStyle)presentingVCAnimationStyle {return PresentingViewControllerAnimationStyleCustom;}- (id<HWPresentingViewControllerAnimatedTransitioning>)customPresentingVCAnimation {return self.customAnimation;}- (HWMyCustomAnimation *)customAnimation {if (!_customAnimation) { _customAnimation = [HWMyCustomAnimationnew]; }return _customAnimation;}
You just need to create your own UIView, then adoptHWPanModalIndicatorProtocol.
In your presented controller, return it:
- (nullable UIView <HWPanModalIndicatorProtocol> *)customIndicatorView { HWTextIndicatorView *textIndicatorView = [HWTextIndicatorViewnew];return textIndicatorView;}Here isHWTextIndicatorView code:
@interfaceHWTextIndicatorView :UIView <HWPanModalIndicatorProtocol>@end@interfaceHWTextIndicatorView ()@property (nonatomic,strong) UILabel *stateLabel;@end@implementationHWTextIndicatorView- (instancetype)initWithFrame:(CGRect)frame { self = [superinitWithFrame:frame];if (self) {// init the _stateLabel [selfaddSubview:_stateLabel]; }return self;}- (void)didChangeToState:(HWIndicatorState)state {switch (state) {case HWIndicatorStateNormal: { self.stateLabel.text =@"Please pull down to dismiss"; self.stateLabel.textColor = [UIColorwhiteColor]; }break;case HWIndicatorStatePullDown: { self.stateLabel.text =@"Keep pull down to dismiss"; self.stateLabel.textColor = [UIColorcolorWithRed:1.000green:0.200blue:0.000alpha:1.00]; }break; }}- (CGSize)indicatorSize {returnCGSizeMake(200,18);}- (void)setupSubviews { self.stateLabel.frame = self.bounds;}@end
You should always inherit fromHWPanModalContentView.HWPanModalContentView conformsHWPanModalPresentable like the way using UIViewController.
@interfaceHWSimplePanModalView :HWPanModalContentView@end@implementationHWSimplePanModalView- (instancetype)initWithFrame:(CGRect)frame { self = [superinitWithFrame:frame];if (self) {// add view and layout. }return self;}// present it.HWSimplePanModalView *simplePanModalView = [HWSimplePanModalViewnew];[simplePanModalViewpresentInView:nil];
- Clone this git.
- open the terminal, run
pod install - Double click HWPanModal.xcworkspace, and select a target to run.
Heath Wangyishu.jay@gmail.com
HWPanModal is released under a MIT License. See LICENSE file for details.
About
HWPanModal presents controller from bottom and drag to dismiss, high customize. iOS13 default modalPresentationStyle. 任意形式的底部弹框动画;头条、知乎、抖音弹出评论效果;地图浮层,iOS13 present默认模态效果。
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.




