ios – 通过改变x位置来拉起和放下UIView

ios – 通过改变x位置来拉起和放下UIView,第1张

概述编辑 这就是我想要的可视化(忽略丑陋的红线,它只是表明UIView的运动): 我想要一个在屏幕中间初始化的UIView.在那之后,我想向上推,然后重力将其拉下,直到它离开屏幕.我的老问题适用于UIPushBehaviour,UIDynamicBehaviour和UIGravityBehaviour(见下文). Matt指出,UIPushBehaviour可能不是正确的选择,因为它在iOS上可用的每 编辑

这就是我想要的可视化(忽略丑陋的红线,它只是表明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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1067859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存