Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ccccwhj-whj opened this issue Jul 15, 2024 · 8 comments
Open

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

ccccwhj-whj opened this issue Jul 15, 2024 · 8 comments
Labels
discuss Discuss with others enhancement New feature or request

Comments

@ccccwhj-whj
Copy link

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

或者还有其他方案?

@HeathWang
Copy link
Owner

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

/**
 * 询问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方法来解决
  • (BOOL)shouldPrioritizePanModalGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint loc = [panGestureRecognizer locationInView:self.view];
    // check whether user pan action in viewA
    if (CGRectContainsPoint(self.viewA.frame, loc)) {
    return YES;
    }

    return NO;
    }

* 默认为NO
*
* This delegate is useful when you want panGestureRecognizer has a high prioritize and
* make scrollable does NOT scroll.
* Example: You controller add a full size tableView, then add viewA on top of your controller view.
* Now you find you can not drag the viewA, use this delegate to resolve problem.
* Please refer to code above this comment.
*
* Default is NO
*/
- (BOOL)shouldPrioritizePanModalGestureRecognizer:(nonnull UIPanGestureRecognizer *)panGestureRecognizer;

/**
* When you pan present controller to dismiss, and the view's y <= shortFormYPos,
* this delegate method will be called.
* @param percent 0 ~ 1, 1 means has dismissed
*/
- (void)panModalGestureRecognizer:(nonnull UIPanGestureRecognizer *)panGestureRecognizer dismissPercent:(CGFloat)percent;

@ccccwhj-whj
Copy link
Author

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

@ccccwhj-whj
Copy link
Author

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

@HeathWang
Copy link
Owner

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

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

@HeathWang
Copy link
Owner

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

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

@HeathWang HeathWang added enhancement New feature or request discuss Discuss with others labels Jul 25, 2024
@ccccwhj-whj
Copy link
Author

我做了几个尝试:
方法一: 使用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像素,在计算高度时候有点碍事

@HeathWang
Copy link
Owner

我做了几个尝试: 方法一: 使用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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discuss Discuss with others enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants