
基本上,它们有一个模态视图控制器,里面有滚动视图.当滚动动作到达其内容的顶部时,视图控制器无缝切换到交互式解雇动画.此外,当手势将视图返回到屏幕顶部时,控制返回到滚动视图.
这是它的外观的GIF.
对于我的生活,我无法弄清楚他们是如何做到的.我尝试了几种不同的方法,但它们都失败了,而且我没有想法.谁能指出我正确的方向?
EDIT2
为了澄清,我想要模仿的行为不仅仅是向下拖动窗口.我能做到,没问题.
我想知道相同的滚动手势(不抬起手指)如何触发解雇转换,然后在将视图拖回原始位置后将控制权转移回滚动视图.
这是我无法弄清楚的部分.
结束EDIT2
EDIT1
这是我到目前为止所拥有的.我能够使用滚动视图委托方法添加处理常规解雇动画的目标选择器,但它仍然无法按预期工作.
我创建了一个UIVIEwController,其UIWebVIEw作为属性.然后我把它放在UINavigationController中,它以模态方式呈现.
导航控制器使用动画/转换控制器进行常规交互式解雇(可以通过导航栏上的手势来完成).
从这里开始,一切正常,但无法从滚动视图触发解雇.
NavigationController.h
@interface NavigationController : UINavigationController <UIVIEwControllerTransitioningDelegate>@property (nonatomic,strong) UIPanGestureRecognizer *gestureRecog;- (voID)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer;@end
NavigationController.m
#import "NavigationController.h"#import "AnimationController.h"#import "TransitionController.h"@implementation NavigationController { AnimationController *_animator; TransitionController *_interactor;}- (instancetype)init { self = [super init]; self.TransitioningDelegate = self; _animator = [[AnimationController alloc] init]; _interactor = [[TransitionController alloc] init]; return self;}- (voID)vIEwDIDLoad { [super vIEwDIDLoad]; // Set the gesture recognizer self.gestureRecog = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [self.vIEw addGestureRecognizer:_gestureRecog];}- (ID<UIVIEwControllerInteractiveTransitioning>)interactionControllerFordismissal:(ID<UIVIEwControllerAnimatedTransitioning>)animator { if (animator == _animator && _interactor.hasstarted) { return _interactor; } return nil;}- (ID<UIVIEwControllerAnimatedTransitioning>)animationControllerFordismissedController:(UIVIEwController *)dismissed { if (dismissed == self || [self.vIEwControllers indexOfObject:dismissed] != NSNotFound) { return _animator; } return nil;}- (voID)handleGesture:(UIPanGestureRecognizer *)gestureRecog { CGfloat threshold = 0.3f; CGPoint translation = [gestureRecog translationInVIEw:self.vIEw]; CGfloat verticalMovement = translation.y / self.vIEw.bounds.size.height; CGfloat downwardMovement = fmaxf(verticalMovement,0.0f); CGfloat downwardMovementPercent = fminf(downwardMovement,1.0f); switch (gestureRecog.state) { case UIGestureRecognizerStateBegan: { _interactor.hasstarted = YES; [self dismissVIEwControllerAnimated:YES completion:nil]; break; } case UIGestureRecognizerStateChanged: { if (!_interactor.hasstarted) { _interactor.hasstarted = YES; [self dismissVIEwControllerAnimated:YES completion:nil]; } _interactor.shouldFinish = downwardMovementPercent > threshold; [_interactor updateInteractiveTransition:downwardMovementPercent]; break; } case UIGestureRecognizerStateCancelled: { _interactor.hasstarted = NO; [_interactor cancelinteractiveTransition]; break; } case UIGestureRecognizerStateEnded: { _interactor.hasstarted = NO; if (_interactor.shouldFinish) { [_interactor finishInteractiveTransition]; } else { [_interactor cancelinteractiveTransition]; } break; } default: { break; } }}@end 现在,我必须在滚动视图到达顶部时触发手势处理.所以,这就是我在视图控制器中所做的.
WebVIEwController.m
#import "WebVIEwController.h"#import "NavigationController.h"@interface WebVIEwController ()@property (weak,nonatomic) IBOutlet UIWebVIEw *webVIEw;@end@implementation WebVIEwController { BOol _isHandlingPan; CGPoint _topContentOffset;}- (voID)vIEwDIDLoad { [super vIEwDIDLoad]; [self.webVIEw.scrollVIEw setDelegate:self];} - (voID)scrollVIEwDIDScroll:(UIScrollVIEw *)scrollVIEw { if ((scrollVIEw.panGestureRecognizer.state == UIGestureRecognizerStateBegan || scrollVIEw.panGestureRecognizer.state == UIGestureRecognizerStateChanged) && ! _isHandlingPan && scrollVIEw.contentOffset.y < self.navigationController.navigationbar.translucent ? -64.0f : 0) { NSLog(@"Adding scroll target"); _topContentOffset = CGPointMake(scrollVIEw.contentOffset.x,self.navigationController.navigationbar.translucent ? -64.0f : 0); _isHandlingPan = YES; [scrollVIEw.panGestureRecognizer addTarget:self action:@selector(handleGesture:)]; }}- (voID)scrollVIEwDIDEndDragging:(UIScrollVIEw *)scrollVIEw willDecelerate:(BOol)decelerate { NSLog(@"DID End Dragging"); if (_isHandlingPan) { NSLog(@"Removing action"); _isHandlingPan = NO; [scrollVIEw.panGestureRecognizer removeTarget:self action:@selector(handleGesture:)]; }}- (voID)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer { [(NavigationController*)self.navigationController handleGesture:gestureRecognizer];} 这仍然无法正常工作.即使在解雇动画期间,滚动视图仍然会以手势滚动.
结束EDIT1
解决方法 这是一个自定义的交互式过渡.首先,您需要设置UIVIEwController的TransitioningDelegate
ID<UIVIEwControllerTransitioningDelegate> TransitioningDelegate;
然后将这两种方法实现
//Asks your delegate for the Transition animator object to use when dismissing a vIEw controller. - animationControllerFordismissedController: //Asks your delegate for the interactive animator object to use when dismissing a vIEw controller. - interactionControllerFordismissal:
当拖动到顶部时,您开始转换,您可以使用UIPercentDrivenInteractiveTransition来控制滚动期间的进度.
您也可以参考ZFDragableModalTransition的源代码
ZfdragableModalTransition的图片
总结以上是内存溢出为你收集整理的iOS – 在关闭和滚动手势之间切换全部内容,希望文章能够帮你解决iOS – 在关闭和滚动手势之间切换所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)