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

时间:2014-07-02 18:17:53

标签: ios uitableview cocoa-touch uiscrollview uikit

我正在构建此应用并遇到以下问题。 (下面的图片)

我有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 个答案:

答案 0 :(得分:0)

尝试此方法。这是在swift

中完成的

使用PanGesture拖动视图控件B'上和下。然后你不需要添加任何scrollview或直接使用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)")



        }



    }

}

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