在 XCode 中平滑滚动视图和表格视图之间的滚动过渡

Posted

技术标签:

【中文标题】在 XCode 中平滑滚动视图和表格视图之间的滚动过渡【英文标题】:Make the scroll transition between a scroll view and a table view smooth in XCode 【发布时间】:2014-07-02 18:17:53 【问题描述】:

我正在构建这个应用程序并遇到了以下问题。 (图片如下)

我有 2 个视图控制器:A 和 B。视图控制器 B 通过 addChildViewController 嵌入到视图控制器 A 中。

视图控制器 B 是一个带有段控制器的表视图。 视图控制器 B 位于视图控制器 A 拥有的滚动视图内。

我想要什么: 我希望所有子视图(滚动视图除外)始终保持静态。 由于 tableview 将有很多项目,我希望用户能够滚动它以展开它,如图所示。一旦到达顶部,它不应再滚动。相反,实际的 tableview 应该开始滚动。 我希望这超级流畅。当用户向上滑动手指时,整个视图控制器 B 应该开始向上;一旦到达顶部,滚动应立即转移到表格视图。 (希望有道理)

到目前为止我所做的尝试: 尝试激活和停用视图控制器 B 中的 tableview 和视图控制器 A 中的滚动视图的 shouldEnableScroll 属性

任何建议将不胜感激 提前致谢

http://s1318.photobucket.com/user/Jose_Bigio/media/photo-2_zpsfe1c7b1a.jpg.html

【问题讨论】:

【参考方案1】:

试试这个方法。这是在swift中完成的

使用 PanGesture 上下拖动“viewcontroller B”。然后你不需要添加任何滚动视图或直接使用 UIView 的

    dragRecognizer = UIPanGestureRecognizer(target: self, action: "handleDrag:")
    dragRecognizer.minimumNumberOfTouches = 1
    dragRecognizer.maximumNumberOfTouches = 1
    viewControllerB.addGestureRecognizer(dragRecognizer) 

然后使用手柄拖动方法。将变量 viewHeight 声明为 CGFloat,并为其赋值 viewHeight = self.view.frame.size.height - viewControllerB.frame.origin.y

现在使用这个 viewHeight 框架,增加你的 tableview 高度。一次并处理拖动方法,使其不会被拖动超过 200(或 viewController B 的某个 origin.y)并且不低于 20。请参见下面的方法。这不是 100% 的解决方案,但您可以根据您的要求进行编辑。

    func handleDrag(recognizer: UIPanGestureRecognizer) 


    if (recognizer.state == UIGestureRecognizerState.Began) 
        touchLocation = recognizer.translationInView(recognizer.view) //returns CGPoint.
        println("Touch location: \(touchLocation)")
        if (touchLocation.y == 0) && (touchLocation.x != 0) 
            isVertical = false
        else 
            isVertical = true
        

     else if (recognizer.state == UIGestureRecognizerState.Changed) 

        translation = recognizer.translationInView(recognizer.view)
        println("translation: \(translation)")
        newLocation = CGPointMake(touchLocation.x, touchLocation.y + translation.y);
        println("New location: \(newLocation)")  // this is for vertical increase or decrease
        var checkPos = CGPoint()
        checkPos = CGPointMake(0, recognizer.view.frame.origin.y + newLocation.y)
        println("Check Position: \(checkPos)")   // 
        var diff = CGFloat()
        if isVertical == true 

            if (checkPos.y > 20 && checkPos.y < 200) 

                newY = checkPos.y   // newY is CGFloat and is used to define new origin of viewcontrollerB

            else
                if (checkPos.y < 85) 

                    newY = 85;


                else if (checkPos.y >= 200)
                    newY = 200


                
            

            viewHeight = self.view.frame.size.height - newY;
            println("viewHeight: \(viewHeight)")
            recognizer.setTranslation(CGPointZero, inView: recognizer.view)
            println("\(recognizer)")
            viewControllerB.frame = CGRectMake(0, newY, 320, viewHeight)
            table.frame = CGRectMake(0, viewControllerB.frame.origin.y + 40, 320, viewControllerB.frame.size.height - 40)

        else if isVertical == false 

            println("Horizontal Swipe: \(isVertical)")

        


     else if (recognizer.state == UIGestureRecognizerState.Ended)
        var velocity = CGPoint()
        velocity = recognizer.velocityInView(recognizer.view)
        println("Velocity : \(velocity)")



        



    


这可能会帮助你进一步提高你的发展。希望这会帮助你。如果已经解决,请忽略。

【讨论】:

以上是关于在 XCode 中平滑滚动视图和表格视图之间的滚动过渡的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中平滑滚动画布

iPhone通过滑出表格视图来滚动UITableview

将一个视图滑过另一个视图

如何在纯 JavaScript 中平滑滚动到元素

在 UICollectionViewCell 内的 UICollectionView 中平滑滚动

如何在 Java 中平滑 JFrame 的滚动