iPhone的自定义滚动条';UIS UIView(使长卷轴不被吸引)

iPhone的自定义滚动条';UIS UIView(使长卷轴不被吸引),iphone,objective-c,uiview,uiscrollview,scroll,Iphone,Objective C,Uiview,Uiscrollview,Scroll,在一篇博文中,Aza Raskin介绍了一种替代的滚动条控件,它更适合在很长的页面上浏览: 滚动条“保留一段时间”来激活它并不重要;我可以简单地沿着iPhone屏幕的右边缘滑动,抓住滚动条手柄。这个想法是,如果我在物理屏幕上将手柄向下拖动3/4,那么我在页面上的位置将向下拖动3/4 t Dropbox iPhone应用程序(顺便说一句,很棒!)正是这种用于长PDF文档的滚动条。常规滚动是通过拖动手柄以外的任何位置来完成的;拖动控制柄可将视图移动到该位置。这似乎是“从头开始”实现的,因为我认为S

在一篇博文中,Aza Raskin介绍了一种替代的滚动条控件,它更适合在很长的页面上浏览:

滚动条“保留一段时间”来激活它并不重要;我可以简单地沿着iPhone屏幕的右边缘滑动,抓住滚动条手柄。这个想法是,如果我在物理屏幕上将手柄向下拖动3/4,那么我在页面上的位置将向下拖动3/4

t Dropbox iPhone应用程序(顺便说一句,很棒!)正是这种用于长PDF文档的滚动条。常规滚动是通过拖动手柄以外的任何位置来完成的;拖动控制柄可将视图移动到该位置。这似乎是“从头开始”实现的,因为我认为SDK不够灵活,无法定制现有滚动条的行为

然而,Dropbox使用本机文档查看器在iPhone上显示文档,因此他们不知何故添加了滚动条功能。看到滚动条手柄了吗?您可以将其拖动到文档中的其他位置

这个概念非常类似于UITableView(即Contacts.app)中索引栏的工作方式;索引显示为表格右侧的一个条(例如,“a”到“z”),您可以触摸特定标签以跳转到目标部分。然而,在这种情况下,一个很长的页面没有分区,它应该用于通用滚动,而不是跳转到分区


那么,我如何实现这种滚动方法呢?我正在寻找总体思路和具体实施细节。我还对是否存在开源实现感兴趣(这似乎是一个通用问题/解决方案)。

我不知道有任何iPhone特定的解决方案,但这是Flash开发领域中一个古老而久经考验的话题。。。您可能会从这个领域提取大量的伪代码

如果您知道窗口的高度、内容的高度以及内容的当前偏移量(您知道),那么您就拥有创建自定义UIView所需的所有工具,该视图可以用作触摸响应滑块。然后只需在默认滚动条上绘制即可。

总体思路:

我抓起dropbox应用程序(太棒了),玩了一会儿。它看起来像是从照片应用程序中获取了一点,除了支持滚动条之外,它还有条件地在触摸屏上显示半透明的导航栏和工具栏。我很确定他们有一个自定义的视图控制器来拦截触摸并做出相应的反应

一触即发:

  • 如果是轻触,则显示/隐藏 导航栏和工具栏
  • 如果是开着的话 洗涤器,开始跟踪 触摸并滚动屏幕 scrollview/webview(无论它们是什么) 显示(带有)。我敢肯定 滚动很简单,就像
    scrollView.contentOffset=
    CGPointMake(0,(scriber.y/[UIScreen mainScreen].bounds.size.height)*
    scrollView.contentSize.height)
    。(三)
  • 否则,将触摸传递到 封闭视图

  • PDF显示可能还有其他隐藏的魔力(我从来没有在cocoa touch中这样做过),但有些东西告诉我这是他们的基本过程。

    可能有一个开源实现。我什么都不知道。也许给Dropbox开发者发封电子邮件

    无论如何,我会这样做:

    @interface UICustomisedScrollView : UISCrollView
    {
        BOOL showingScroller;
        UIView scroller; //Customise this, either in IB or in viewDidLoad
    }
    
    @implementation UICustomisedScrollView
    
    - (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view {
        showingScroller = !showingScroller;
        if(showingScroller)
            scroller.hidden = NO;
        else
            scroller.hidden = YES;
    }
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        if(showingScroller) {
            if(/*the touch is on the scroller*/) {
                 /* scrollview.setContentOffset(...) we want to scroll according to how much the user scrolls here */
            }
            //move scroller.frame.origin to where the touch is.
        }
    }
    

    我猜这不会太难。。。但是我还没有测试上面的代码。无论如何,这就是总体思路=)

    尝试使用
    UIPangestureRecognitor
    。在您的操作中,可以使用
    locationInView
    确定用户正在触摸的点。当状态为
    UIgestureRecognitizerStateStarted
    时执行此操作,如果距离视图侧面足够近,则执行快速滚动。否则,请执行慢速滚动

    哇,我自己也在想同样的事情。感谢您提出这个问题,并提供了如此详细的信息和文档。我迫不及待地想找到答案。有什么最新消息吗。您是否已经在这方面取得了成功并愿意与他人分享?请注意,这应该是[UIScreen mainScreen].bounds.size.height,而不是480,用于iPhone 5。