- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想弄清楚是否可以在 UIScrollview 中使用 UIAnimator 中的 UISnapBehavior 来使 ScrollView 的内容对齐到一个点。到目前为止,我的发现导致这是不可能的。
我正在努力实现的目标
UIScrollView 在用户拖动 ScrollView 时“捕捉”到特定点。但是,滚动必须从捕捉位置恢复,而无需用户解除触摸。
Apple 似乎在其 iOS 照片应用程序的照片编辑中实现了这一点。 (见下面的截图)
我尝试了什么
我试图通过将 UIPanGestureRecognizer 附加到 ScrollView 并使用它的速度来获得此行为。如果用户向捕捉点拖动, ScrollView 将禁用滚动,动画到捕捉点,完成动画后它将重新启用滚动。
但是,这会导致用户必须在拖动并重新拖动 ScrollView 后取消触摸。然而,Apple 似乎在没有解除阻力的情况下就做到了。
最佳答案
我尝试模仿 iOS 照片应用。这是我的逻辑:
// CALCULATE A CONTENT OFFSET FOR SNAPPING POINT
let snapPoint = CGPoint(x: 367, y: 0)
// CHANGE THESE VALUES TO TEST
let minDistanceToSnap = 7.0
let minVelocityToSnap = 25.0
let minDragDistanceToReleaseSnap = 7.0
let snapDuringDecelerating = false
这种滚动需要3个阶段
enum SnapState {
case willSnap
case didSnap
case willRelease
}
willSnap:
默认状态。决定何时捕捉。比较 contentOffset distance from SnapPoint with minDistanceToSnap
和 scrollview velocity with minVelocityToSnap
.改为didSnap
状态。didSnap:
手动 setContentOffset
到提供的 contextOffset(snapPoint)
.计算 dragDistance
在 scrollView
.如果用户拖动超过一定距离 ( minDragDistanceToReleaseSnap
) 更改为 willRelease
状态。willRelease:
改为willSnap
如果 distance scroll from snapPoint
再次声明大于minDistanceToSnap
.extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(scrollView: UIScrollView) {
switch(snapState) {
case .willSnap:
let distanceFromSnapPoint = distance(between: scrollView.contentOffset, and: snapPoint)
let velocity = scrollView.panGestureRecognizer.velocityInView(view)
let velocityDistance = distance(between: velocity, and: CGPointZero)
if distanceFromSnapPoint <= minDistanceToSnap && velocityDistance <= minVelocityToSnap && (snapDuringDecelerating || velocityDistance > 0.0) {
startSnapLocaion = scrollView.panGestureRecognizer.locationInView(scrollView)
snapState = .didSnap
}
case .didSnap:
scrollView.setContentOffset(snapPoint, animated: false)
var dragDistance = 0.0
let location = scrollView.panGestureRecognizer.locationInView(scrollView)
dragDistance = distance(between: location, and: startSnapLocaion)
if dragDistance > minDragDistanceToReleaseSnap {
startSnapLocaion = CGPointZero
snapState = .willRelease
}
case .willRelease:
let distanceFromSnapPoint = distance(between: scrollView.contentOffset, and: snapPoint)
if distanceFromSnapPoint > minDistanceToSnap {
snapState = .willSnap
}
}
}
}
辅助函数
func distance(between point1: CGPoint, and point2: CGPoint) -> Double {
return Double(hypotf(Float(point1.x - point2.x), Float(point1.y - point2.y)))
}
在Github上做了一个演示项目:https://github.com/rishi420/SnapDrag
注意:使用 Xcode 7.2 制作的项目。您可能需要稍作更改才能编译。
关于ios - UIAnimator 的 UISnapBehavior 可以与 UIScrollview 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38465498/
我正在使用 UISnapBehavior,但它的捕捉速度太快了,我不喜欢。有没有办法让它慢下来?或者换句话说:有没有办法用它应该捕捉的点来调整物体的弹性? 最佳答案 我能够通过将 View 附加到 U
无论出于何种原因,每当我使用捕捉行为时,它都会导致 UIButton 在“捕捉”时变成各种大小的矩形。我可能只是在看这个问题。我的最后期限是明天,以解决最后的错误,所以我将不胜感激任何帮助!谢谢! v
我正在尝试使用 UISnapBehaviour 为 UIButton 设置动画。我关注了Apple References和 Apple Dynamics Catalog ,但不是使用点击手势来启动动画
在我的应用程序中,我有一些小 View ,可以通过拖动它们来移动它们。当用户开始拖动其中一个小 View 时,它会留在原地,但会“拉伸(stretch)”一定距离(~200 点)。超过距离后,小 Vi
我可以通过添加具有阻力的 UIDynamicItemBehavior 轻松地使捕捉更慢。然而,阻力的默认值是 0.0,这对我来说还是太慢了。将阻力设置为负值没有效果,它似乎移动得像 0.0 一样快。
我正在尝试使用 UISnapBehavior 创建一个tweening back 动画。 我正在尝试制作一个可拖动的正方形,然后当正方形被释放时,它会补间回到原来的位置。每次它后退时,它似乎都有一个奇
我正在研究 CS193P,我想创建一种效果,让卡片从 0,0 一个接一个地卡入到位。我试图链接动画,但 View 一起飞行,我也在尝试使用 UIDynamicAnimator 并且发生了同样的事情。所
我正在使用 UIDynamicAnimator 的 UISnapBehavior 在两种状态之间制作这些圆圈的动画: http://cl.ly/image/1G3p1B2x2v14/Image%202
我想弄清楚是否可以在 UIScrollview 中使用 UIAnimator 中的 UISnapBehavior 来使 ScrollView 的内容对齐到一个点。到目前为止,我的发现导致这是不可能的。
我是一名优秀的程序员,十分优秀!