这就是我想要的可视化(忽略丑陋的红线,它只是表明UIVIEw的运动):
我想要一个在屏幕中间初始化的UIVIEw.在那之后,我想向上推,然后重力将其拉下,直到它离开屏幕.我的老问题适用于UIPushBehavIoUr,UIDynamicBehavIoUr和UIGravityBehavIoUr(见下文). Matt指出,UIPushBehavIoUr可能不是正确的选择,因为它在iOS上可用的每个屏幕尺寸上都不能很好地运行.
我可以使用UIVIEw.animate函数执行此 *** 作,但它实际上是静态的并且看起来不自然.使用UIPushBehavIoUr,UIDynamicBehavIoUr和UIGravityBehavIoUr,看起来非常不错,但无法在每个屏幕尺寸上计算UIPushBehavIoUr的幅度,以获得UIVIEw的x和y位置的相同终点.
题
如何在屏幕中间初始化UIVIEw,“拉起”UIVIEw(x位置有一些变化)并让重力(或其他东西)将其拉下直到它离开屏幕?重要的是,x和y位置的变化在每个屏幕尺寸上都是相同的.
以下是我的老问题
我有一个UIPushBehavIoUr,具有瞬时模式,我可以推动一些UIVIEws.屏幕尺寸越大,推动的越少.
我也有一个UIDynamicItemBehavior,阻力设置为1,我认为这是每个屏幕尺寸不同的主要原因之一(如果我错了,请纠正我).
我想要一个能够将UIVIEw推到相同终点的功能,无论屏幕大小如何,都具有相同的速度,持续时间和终点.
我试图在没有任何运气的情况下做出相对规模:
对于iPhone 5S,让我们说0.5的幅度会从中间到顶部触及UIVIEw.我想计算所有设备的幅度,如下所示:
let y = 0.5 / 520 // 5S screen heightmagnitude = self.vIEw.frame.height * y
对于iPhone 8,它有一个非常不同的输出,并没有工作.阅读the docs时,我想我会明白的.我认为1幅度代表100像素,但显然不是这种情况.
有什么方法可以计算出一个幅度,例如,从中间向右移动UIVIEw?
我制作了a project here.有一个黑色UIVIEw在iPhone 5上被推到了边缘,但在iPhone 8上却没有.
解决方法 解您需要相对于屏幕大小缩放推送量,以便视图始终在同一位置结束.为此,调整UIPushBehavior的pushDirection向量非常有效.在这种情况下,我将推动方向设置为与视图的边界成比例,并将其按常数因子缩小.
let push = UIPushBehavior(items: [pushVIEw],mode: .instantaneous)let pushFactor: CGfloat = 0.01push.pushDirection = CGVector(dx: -vIEw.bounds.wIDth * pushFactor,dy: -vIEw.bounds.height * pushFactor)animator.addBehavior(push)
您可能需要调整一些常量以获得所需的精确动画.您可以调整的常量是:
>重力幅度(目前为0.3)
>推动因子(目前为0.01)
根据您的需要,您可能需要缩放与屏幕大小成比例的重力大小.
注意:这些常量需要根据动画视图的大小进行更改,因为UIKit Dynamics会将视图的大小视为质量.如果您的视图需要动态调整大小,则需要根据动画视图的大小缩放常量.
编辑有关原始问题的评论:
>不同大小的视图:就像我在上面的注释中提到的那样,您需要应用一个额外的因子来解释视图的“质量”.像vIEw.frame.height * vIEw.frame.wIDth * someConstant这样的东西应该运行良好.
> iPad屏幕尺寸:目前pushFactor应用于矢量的dx和dy组件.由于iPad具有不同的宽高比,因此您需要将其拆分为两个常量,可能是xpushFactor和yPushFactor,它们可以解释宽高比的差异.
例子
iPhone 8
iPhone SE
完整的游乐场源代码
将此代码复制并粘贴到Swift *** 场中以查看其运行情况.我已经包含了各种iPhone屏幕的尺寸,因此只需取消注释您希望在不同设备尺寸上轻松测试动画的尺寸.大多数有趣/相关的代码都在vIEwDIDAppear中.
import UIKitimport PlaygroundSupportclass VIEwController: UIVIEwController { let pushVIEw = UIVIEw() var animator: UIDynamicAnimator! overrIDe func vIEwDIDLoad() { super.vIEwDIDLoad() vIEw.frame = CGRect(x: 0,y: 0,wIDth: 568,height: 320) // iPhone SE// vIEw.frame = CGRect(x: 0,wIDth: 667,height: 375) // iPhone 8// vIEw.frame = CGRect(x: 0,wIDth: 736,height: 414) // iPhone 8+// vIEw.frame = CGRect(x: 0,wIDth: 812,height: 375) // iPhone X vIEw.backgroundcolor = .white let pushVIEwSize = CGSize(wIDth: 200,height: 150) pushVIEw.frame = CGRect(x: vIEw.bounds.mIDX - pushVIEwSize.wIDth / 2,y: vIEw.bounds.mIDY - pushVIEwSize.height / 2,wIDth: pushVIEwSize.wIDth,height: pushVIEwSize.height) pushVIEw.backgroundcolor = .red vIEw.addSubvIEw(pushVIEw) animator = UIDynamicAnimator(referenceVIEw: self.vIEw) let dynamic = UIDynamicItemBehavior() dynamic.resistance = 1 animator.addBehavior(dynamic) } overrIDe func vIEwDIDAppear(_ animated: Bool) { super.vIEwDIDAppear(animated) let gravity = UIGravityBehavior(items: [pushVIEw]) gravity.magnitude = 0.3 animator.addBehavior(gravity) let push = UIPushBehavior(items: [pushVIEw],mode: .instantaneous) let pushFactor: CGfloat = 0.01 push.pushDirection = CGVector(dx: -vIEw.bounds.wIDth * pushFactor,dy: -vIEw.bounds.height * pushFactor) animator.addBehavior(push) }}let vc = VIEwController()PlaygroundPage.current.needsIndefiniteExecution = truePlaygroundPage.current.liveVIEw = vc.vIEw总结
以上是内存溢出为你收集整理的ios – 通过改变x位置来拉起和放下UIView全部内容,希望文章能够帮你解决ios – 通过改变x位置来拉起和放下UIView所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)