ios - 如何欺骗 UIScrollView 在平移中间开始滚动?

标签 ios iphone ipad uiscrollview uipangesturerecognizer

示例:

你有一个带有scrollEnabled = NO的UIScrollView。 用户平移一定距离后,您希望 ScrollView 开始滚动。

当手指在屏幕上向下移动并且我禁用滚动时, ScrollView 将处于死状态,直到手指抬起为止。在平移中间启用滚动不会导致其启动。

我怀疑这是因为 UIScrollView 如果在其内部 TouchBegan:withEvent: (或其私有(private)平移手势识别器)期间滚动Enabled=NO,将决定忽略触摸序列。

如何欺骗它在触摸序列中间开始本地滚动(具有弹跳效果)?

原因:对于需要此机制的简单的基于 UIKit 的游戏。

最佳答案

好吧,这仍然需要一些调整来处理第一次滚动停止后再次滚动,但我认为您想要实现的关键是实现 UIScrollViewDelegate 方法scrollViewDidScroll:。从这里,您可以保存 ScrollView 的起始内容偏移量,并将 ScrollView 的当前偏移量与添加到 ScrollView 平移手势识别器的 y 平移的起始偏移量进行比较。

下面的代码成功地不允许滚动开始,直到用户平移至少 100 点。就像我说的,这需要一些调整,但应该足以让您继续下去。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self setStartingOffset:CGPointMake(0.0, -1.0)];
}


- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (self.startingOffset.y < 0.0) {
        [self setStartingOffset:scrollView.contentOffset];
    }else{
        static CGFloat min = 100.0;
        CGFloat yTranslation = fabs([scrollView.panGestureRecognizer translationInView:scrollView].y);

        if (yTranslation < self.startingOffset.y + min) {
            [scrollView setContentOffset:self.startingOffset];
        }else{
            if (self.startingOffset.y >= 0.0) {
                [self setStartingOffset:CGPointMake(0.0, -1.0)];
            }
        }
    }
}

关于ios - 如何欺骗 UIScrollView 在平移中间开始滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497871/

相关文章:

android - 如何为 android 和 iphone 创建自己的 Magento 移动应用程序

xcode - iPad:在不使用 Interface Builder 配置的情况下启动 MainWindow.xib 的主视图

iphone - iOS:如何使 UIButton 在按下时变为蓝色?

objective-c - maskToBounds :YES affecting scroll performance

ios - 无法构建 Xcode 项目

iphone - 这是否高效 - 向每个 UITableViewCell 添加手势识别器

iphone - 核心数据错误 : _Unwind_Resume called from function _PFFaultHandlerLookupRow in image CoreData

cocoa - iPad键盘: mode based key augmentation

ios - 将iPhone应用程序转换为框架

ios - 当快速弹出日期选择器选择器时,如何阻止 ui 对象被覆盖