iOS – 在关闭和滚动手势之间切换

iOS – 在关闭和滚动手势之间切换,第1张

概述Line Messenger应用程序(日本的事实上的信使应用程序)中有一种行为,我试图模仿. 基本上,它们有一个模态视图控制器,里面有滚动视图.当滚动动作到达其内容的顶部时,视图控制器无缝切换到交互式解雇动画.此外,当手势将视图返回到屏幕顶部时,控制返回到滚动视图. 这是它的外观的GIF. 对于我的生活,我无法弄清楚他们是如何做到的.我尝试了几种不同的方法,但它们都失败了,而且我没有想法.谁能指出 line Messenger应用程序(日本的事实上的信使应用程序)中有一种行为,我试图模仿.

基本上,它们有一个模态视图控制器,里面有滚动视图.当滚动动作到达其内容的顶部时,视图控制器无缝切换到交互式解雇动画.此外,当手势将视图返回到屏幕顶部时,控制返回到滚动视图.

这是它的外观的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 – 在关闭和滚动手势之间切换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1031985.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存