在 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 中平滑滚动视图和表格视图之间的滚动过渡的主要内容,如果未能解决你的问题,请参考以下文章