HeathWang / HWPanModal

HWPanModal presents controller from bottom and drag to dismiss, high customize. iOS13 default modalPresentationStyle. 任意形式的底部弹框动画;头条、知乎、抖音弹出评论效果;地图浮层,iOS13 present默认模态效果。
MIT License
1.17k stars 199 forks source link

如何实时获取hw_contentView的y值? #152

Open ccccwhj-whj opened 3 months ago

ccccwhj-whj commented 3 months ago

场景: 还原类似于抖音评论弹起时,背景视屏等比缩小放大,需要实时获取到view的y高度。如果直接在完成的回掉中修改,效果不好

或者还有其他方案?

HeathWang commented 3 months ago

可以通过协议中的方法来动态处理

/**
 * 询问delegate是否需要使拖拽手势生效
 * 若返回NO,则禁用拖拽手势操作,即不能拖拽dismiss
 * 默认为YES
 */
- (BOOL)shouldRespondToPanModalGestureRecognizer:(nonnull UIPanGestureRecognizer *)panGestureRecognizer;

/**
 * 当pan recognizer状态为begin/changed时,通知delegate回调。
 * 当拖动presented View时,该方法会持续的回调
 * 默认实现为空
 */
- (void)willRespondToPanModalGestureRecognizer:(nonnull UIPanGestureRecognizer *)panGestureRecognizer;

/**
 * 内部处理完成拖动操作后触发此回调,此时view frame可能已经变化。
 * Framework has did finish logic for GestureRecognizer delegate. It will call many times when you darg.
 */
- (void)didRespondToPanModalGestureRecognizer:(nonnull UIPanGestureRecognizer *)panGestureRecognizer;

/**
 * 内部处理完成拖动操作后触发此回调,此时view frame可能已经变化。
 * Framework has did finish logic for GestureRecognizer delegate. It will call many times when you darg.
 */
- (void)didEndRespondToPanModalGestureRecognizer:(nonnull UIPanGestureRecognizer *)panGestureRecognizer;

/**
 * 是否优先执行dismiss拖拽手势,当存在panScrollable的情况下,如果此方法返回YES,则
 * dismiss手势生效,scrollView本身的滑动则不再生效。也就是说可以拖动Controller view,而scrollView没法拖动了。
 *
 * 例子:controller view上添加一个TableView,并铺满全屏,然后在controller view 顶部添加一个一定大小的viewA,
 * 这个时候会发现viewA有时候无法拖动,可以实现此delegate方法来解决

/**

ccccwhj-whj commented 3 months ago

谢谢的提示,实际上我确实已经在这个按照这些代理实现了一般,但是会存在一个比较不好解决的问题: 场景 : 当我滑动过程中(手没有松开)这个时候是没有问题的,我能获取到各种我需要的参数。当我在中途突然松开手指,这个时候就没有那么平滑了,因为值是从当前直接变到结束的值, 但是弹窗又有动画,这会导致视觉上的效果不好(不同步)。 目前我尝试做了一个uiview动画, 看起来倒是挺好的,但是想讨论一下有没有更好的方案,因为据我所知,动画过程中的frame好像没有方法获取

ccccwhj-whj commented 3 months ago

另外咨询一下有没有计划出swift版本?

HeathWang commented 3 months ago

另外咨询一下有没有计划出swift版本?

没有纯swift版本,但是swift可以引入使用

HeathWang commented 3 months ago

谢谢的提示,实际上我确实已经在这个按照这些代理实现了一般,但是会存在一个比较不好解决的问题: 场景 : 当我滑动过程中(手没有松开)这个时候是没有问题的,我能获取到各种我需要的参数。当我在中途突然松开手指,这个时候就没有那么平滑了,因为值是从当前直接变到结束的值, 但是弹窗又有动画,这会导致视觉上的效果不好(不同步)。 目前我尝试做了一个uiview动画, 看起来倒是挺好的,但是想讨论一下有没有更好的方案,因为据我所知,动画过程中的frame好像没有方法获取

确实是有这个问题,后面我看看怎么较好的兼容这种情况

ccccwhj-whj commented 3 months ago

我做了几个尝试: 方法一: 使用DisplayLink获取动画过程中panContainerView的frame

方法二: 将指示器的设置为一个view,然后再变化的时候多次刷新frame ,用来改变大小。(这种适合天猫选择商品下单的时候那种第二次网上滑动, 顶部一张图变小的效果) 但是 指示器和panContainerView有个间隔为5的距离

所以我想大佬能不能出个方案类似于指示器那种view,达到可以自定义顶部的效果, 还有就是你那个默认顶部有个21像素,在计算高度时候有点碍事

HeathWang commented 3 months ago

我做了几个尝试: 方法一: 使用DisplayLink获取动画过程中panContainerView的frame

  • (void)startWatchDisplayLink { [self stopWatchDisplayLink]; self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(watchDisplayLink)]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } 可以在手指松开以后接力获取变化的freme,(这种适合抖音评论的那种效果)

方法二: 将指示器的设置为一个view,然后再变化的时候多次刷新frame ,用来改变大小。(这种适合天猫选择商品下单的时候那种第二次网上滑动, 顶部一张图变小的效果) 但是 指示器和panContainerView有个间隔为5的距离

所以我想大佬能不能出个方案类似于指示器那种view,达到可以自定义顶部的效果, 还有就是你那个默认顶部有个21像素,在计算高度时候有点碍事

”默认顶部有个21像素“可以配置为0的

目前没时间开发,你可以fock 提pr

ccccwhj-whj commented 3 months ago

好的。等我在多看一下你的代码,争取做到丝滑。 现在做的不是很丝滑