- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在编写可扩展托盘 View 的代码,它使用 UIDynamicAnimator 来实现漂亮的展开/收缩动画。
为了实现逼真的加速,我使用 UIGravityBehavior
让我的托盘掉落,直到托盘的“标签”触及屏幕底部。
这很好用,但即使场景中的所有项目都停止移动,也永远不会调用 UIDynamicAnimatorDelegate dynamicAnimatorDidPause:
。这意味着动画师继续使用 CPU 周期为场景设置动画(委托(delegate)已设置,并为 UIDynamicAnimatorDelegate dynamicAnimatorDidPause:
触发)。
我尝试从场景中移除 UIGravityBehavior
,这确实导致动画师最终停止。不过,我无法正确安排移除重力行为的时间,因为我需要在一切都停止移动后将其从场景中移除。
我知道重力是一种恒定的力,但我仍然认为一旦一切都具有 0 速度和 0 加速度,它就会停止动画师。
最后一个假设是错误的吗?
有人遇到类似的问题吗?
最佳答案
你说得对,动画师应该在一切静止后暂停。
检查哪些 items
附加到您的重力行为,并确保没有其他项目仍在下落。例如,很容易不小心造成以下错误:
在这种情况下,“幽灵元素”将永远掉落。
另一个可能的问题(虽然根据您的描述不太可能)是如果您的项目附加到导致无限但小的“反弹”的其他行为。我会检查你的动画师的完整行为列表(记得也要检查 child 的行为)。特别是,我会对添加 elasticity
的任何 UIDynamicItemBehavior
感兴趣。
编辑:
您可能还想走另一条路。从一个非常基本的动力学系统开始,然后添加您自己的组件,直到您可以重现问题。例如,以下确实很快收敛(记录“暂停”):
@interface PTLViewController () <UIDynamicAnimatorDelegate>
@property (nonatomic, strong) UIDynamicAnimator *animator;
@end
@implementation PTLViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100,100,100,100)];
view.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:view];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
self.animator.delegate = self;
UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[view]];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collisionBehavior];
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[view]];
[self.animator addBehavior:gravityBehavior];
}
- (void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator {
NSLog(@"pause");
}
@end
关于获取所有项目速度的问题,我不知道有什么简单的方法可以做到这一点。不幸的是,UIDynamicAnimator
并不直接知道它的所有项目。这是间接的,因为 UIDyanamicBehavior
不包含 items
属性。如果这让您和我一样困扰,请考虑重复 radar://15054405 .
但是如果你只想知道特定元素的当前线速度,那么有一个解决方案。只需添加一个带有自定义操作的 UIDynamicItemBehavior
即可记录它:
UIDynamicItemBehavior *dynamicItemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[view]];
__weak UIDynamicItemBehavior *weakBehavior = dynamicItemBehavior;
dynamicItemBehavior.action = ^{
NSLog(@"Velocity: %@", NSStringFromCGPoint([weakBehavior linearVelocityForItem:view]));
};
[self.animator addBehavior:dynamicItemBehavior];
关于ios - 当 UIGravityBehavior 处于事件状态时,UIDynamicAnimator 拒绝达到平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19385003/
我遇到了与 https://stackoverflow.com/questions/28275004/uidynamicanimator-stop-reacting-to-uigravitybehav
我正在尝试向 UIGravityBehavior 添加一个 View (我通过 cmd 将其创建为图形+将其拖动到我的代码并创建一个 Outlet)但是我的应用程序崩溃了,尽管当我在代码中创建相同的
我正在尝试手动更改 UIDynamics 中的 View 旋转,但 View 的旋转总是在更新后重置。 documentation说,UIDynamicAnimator的updateItemUsing
我在使用 initWithItem:attachedToItem: 时遇到问题 初始化连接一个动态项的中心点到另一个动态项的中心点的附件行为。但是当我使用方法 pan 改变 topview 的中心点时
我使用 UIDynamicsAnimator 取得了良好的效果,只是动画完成后,插入和弹起的图像变得模糊。请帮助我。 @property (nonatomic,weak) IBOutlet UIIma
我是自动布局的新手。我有一个 View 层次结构可以很好地与自动布局一起工作。 我有一个显示菜单的容器 View 。我正在使用 Dynamics 为这个 View 设置动画以产生流行效果: View
我想放慢由我的 UIDynamicAnimator 生成的动画,以便我可以微调我的 UIDynamicBehaviors。 在 ios 模拟器中,调试菜单下有一个菜单选项,标签为“在最前面的应用程序中
我在 Xcode 7 中工作,应用程序适用于 IOS 9。目标是使用 UIDynamicAnimator、UIGravityBehavior 和 UICollisionBehavior 让圆形物体表现
我知道 sprite kit 是玩游戏的方式,但我想知道是否有办法使用 UIDynamicAnimator 来设置除重力之外的额外恒定力。我正在制作平台游戏并将重力设置为向下。我有部分屏幕设置来表示箭
我定义了 UIDynamicAnimator 属性: lazy fileprivate var animator: UIDynamicAnimator = { return UIDyn
您将如何暂停和恢复 UIDynamicAnimator 的物理模拟?无法以编程方式暂停和恢复。当所有项目都处于静止状态时会出现“暂停”状态,但我正在寻找不同的东西。例如,我想让一个物体被重力场拉动,然
在使用 Xcode 5.1.1 在 iOS7 中使用新的物理引擎时,我编写了以下代码: #import "ZViewController.h" @interface ZViewController (
我想使用 UIDynamicAnimator 和重力/碰撞/弹性效果来制作放下物体的动画。我查看了 Apple 的示例应用程序 DynamicsCatalog , 它非常简单,除了当对象从其容器边界外
我正在尝试读取我的设备运动,特别是设备处于横向模式时的滚动,并将返回的角度转换为 UIView 的位置(基本上是在屏幕上制作“级别”以向用户显示手机处于理想角度)。 此代码给出了所需的滚动结果,但由于
我正在阅读 O'Reilly 的 Swift Development with Cocoa 并收到以下错误: Bound value in a conditional binding must be
我有一个 ViewController,它已在 InterfaceBuilder 中配置为对其所有 subview 使用 AutoLayout。布局工作正常。 我想使用 UIDynamicAnimat
我正在玩 UIKitDynamics ,它真的很整洁。目前我有这段代码: CGPoint center = [newSelectedLabel center]; [self.animator remo
我正在尝试创建一个 View ,其中一些项目沿正常重力矢量落下,而其他项目沿相反矢量落下 self.animator = [[UIDynamicAnimator alloc] initWithRefe
我有一个名为 DropitBehavior 的类,它继承自 UIDynamicBehavior。我的 UIViewController 中有两个属性。 @property (strong, nonat
当调用 applicationDidEnterBackground 时,如何停止 UIDynamicAnimator?另外,如何在 applicationWillEnterForeground 中启动
我是一名优秀的程序员,十分优秀!