我已经研究了很多,但我在任何地方都能找到的唯一例子是为了定义 UIView 的边界,以便它们在对象的外部相互碰撞/反弹。
示例:一个球击中另一个球,然后它们相互弹开。
但是我想要做的是创建一个圆形视图来包含其他 UIViews,这样包含的边界是一个圆形,而不是默认的正方形。有没有办法实现这一目标?
通过添加带阻力的UIDynamicItemBehavior,我可以轻松地使捕捉速度变慢.但是,阻力的默认值是0.0,这对我来说仍然太慢.将阻力设置为负值没有任何影响,它似乎移动到0.0.
如何让UISnapBehavior更快?
(以下是使捕捉速度变慢的示例):
UIDynamicItemBehavior *dynamicItemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[button]];
dynamicItemBehavior.resistance = 50.0; // This makes the snapping SLOWER
UISnapBehavior *snapBehavior = [[UISnapBehavior alloc] initWithItem:button snapToPoint:point];
[self.animator addBehavior:button.dynamicItemBehavior];
[self.animator addBehavior:button.snapBehavior];
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何使用UIKit Dynamics成功碰撞两个具有自定义边界形状的UIViews.
我可以想到解释我的问题的最基本的例子是让两个圆碰撞(考虑他们的圆角)而不是他们的方形边界.
我确定我已经在某个地方见过这个但我无法从任何官方消息来源找到关于这个主题的任何文件或讨论.
我想在我的iOS应用程序中创建一个类似橡胶的按钮:当用户点击按钮时,它会缩小其框架,当用户释放水龙头时,它会增长,展开一点然后再转回原来的大小弹跳效果就像是用橡胶制成的.我在其他一些应用程序中看到了这种按钮,我很确定他们使用iOS 7 UIKit动态来实现这种效果.我检查了UIKit动力学的不同行为,但它们似乎都没有用,因为它们都没有改变框架的大小.我想知道是否有任何关于如何实现此行为的提示?
我正在编写一个应用程序,我使用UIKit Dynamics来模拟不同圈子之间的相互作用.
我用以下代码创建了我的圈子:
self = [super initWithFrame:CGRectMake(location.x - radius/2.0, location.y - radius/2, radius, radius)];
if (self) {
[self.layer setCornerRadius: radius /2.0f];
self.clipsToBounds = YES;
self.layer.masksToBounds = YES;
self.backgroundColor = color;
self.userInteractionEnabled = NO;
}
return self;
Run Code Online (Sandbox Code Playgroud)
其中location表示圆的所需位置,半径表示半径.
然后,我通过执行以下操作将这些圈子添加到不同的UIBehaviours:
[_collision addItem:circle];
[_gravity addItem:circle];
[_itemBehaviour addItem:circle];
Run Code Online (Sandbox Code Playgroud)
itemBaviour定义如下:
_itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:@[square]];
_itemBehaviour.elasticity = 1;
_itemBehaviour.friction = 0;
_itemBehaviour.resistance = 0;
_itemBehaviour.angularResistance = 0;
_itemBehaviour.allowsRotation = NO;
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,我的圈子表现为正方形.当以某种方式击中时,它们会获得角动量并失去速度.如果它们再次碰撞,有时角动量再次恢复到速度.这对于正方形来说看起来很正常,但是当视图是圆的时候,就像在我的情况下一样,这种行为看起来很奇怪而且不自然.
打开一些调试选项,我做了这个截图:

如你所见,圆圈显然是一个正方形.
所以我的问题是,如何创建一个真正的圆形UIVIew并在UIKit Dynamics中表现如此?
有没有办法让 UISnapBevahiour 只沿着线性 x 轴工作?
我想要 UISnapBehaviour 的确切行为,但不希望它在 x 和 y 轴上“摇动”到位置,而只是在 x 轴上摇动。
这是针对表格单元格的 contentView 内的 UIView 的。
Run Code Online (Sandbox Code Playgroud)// UIKitDynamics self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self]; CGPoint centerPoint = self.contentView.center; self.snapBehaviour = [[UISnapBehavior alloc] initWithItem:self.frontView snapToPoint:centerPoint]; [self.snapBehaviour setDamping:1.0f]; [self.animator addBehavior:self.snapBehaviour]; UIDynamicItemBehavior *itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:@[self.frontView]]; itemBehaviour.elasticity = 0.0f; itemBehaviour.allowsRotation = NO; [self.animator addBehavior:itemBehaviour];
我已经阅读了文档,我很尴尬地说我很困惑.
场景:
我有一个UIView,就像一个容器3 UIButtons.这个容器最初是边界的{0, 0, 35, 35},每个按钮里面都有相同的坐标(带alpha0).在用户的特定动作上,容器改变边界{0, 0, 100, 35},并且按钮分别用alpha1 动画到x-origin 5,35和65,使得它们在调整大小的容器内展开.我将此称为容器的展开状态.用户执行相同操作,将其切换回原始合同状态.
目标:
我目前正在使用[UIView animateWithDuration:]块进行此操作,但是想使用它UIDynamicAnimator来添加弹性效果,这样,当切换到展开状态时,容器会通过反弹调整大小(稍微调整大小,然后弹回到目标边界),按钮也会弹跳(向前移动一点,然后弹回到目标边界).
困惑:
UIDynamicAnimator,UIDynamicBehavior,UIAttachmentBehavior,UIDynamicItem.....所有这些都导致我的理解UIKitDynamic溢出.我想我应该使用UISnapBehavior,但我不知道如何去做.
我有一个小UIView在一个盒子里反弹.我正在添加一个瞬时模式.推.事实上,我正在添加很多推 - 5或更多Hz.
神秘:
(1)我必须删除行为???? 如果是的话...... 什么时候?!?"后"是"瞬间"?
(2)UIPushBehaviorModeInstantaneous是一个特例,你不必(或不能)删除那些??
(3)当你添加行为时:那个......保留吗?!UIPushBehavior?要么??WTF?
(4)我似乎无法在任何地方找到这些方面!
-(void)pushMeRight:(CGFloat)mag
{
if ( self.bounceAnimator == nil ) return;
NSLog(@"...........push me right %.2f", mag);
UIPushBehavior *pushRight = [[UIPushBehavior alloc]
initWithItems:@[self]
mode:UIPushBehaviorModeInstantaneous];
pushRight.magnitude = mag;
pushRight.angle = radians(0); // (NB, 0 is right, 90 is down)
[self.bounceAnimator addBehavior:pushRight];
}
Run Code Online (Sandbox Code Playgroud)
{注意:我每次需要时都会分配UIPushBehavior .请注意,如果您尝试使用"只有一个"作为属性,则它不起作用.事实上,Rob在下面解释了原因.}
解
经过极其广泛的测试,我们发现Rob的"第二"解决方案,使用.action,基本上是完美的.
经过大量测试后,我们强烈建议以下代码,实际上是"解决方案",是重复推送代码的唯一方法.感谢Rob的好处:/
-(void)pushAllUp:(CGFloat)mag
{
if ( self.bounceAnimator == nil ) return;
for ( UIView *pushme in self.subviews )
{ …Run Code Online (Sandbox Code Playgroud) UIKit中的视图几何体指定它作用于从左上角(0,0)开始的轴,并在向右下方移动时以x和y递增.
UIOffsetMake()在UIKit Dynamics中使用了很多,我想知道它是否遵循类似的模型.它用于相对于UIView的中心指定您希望视图被推送到的点所在的位置.
如果我指定UIOriginMake(5.0, -5.0)它是否从中心更改为右下角?因为它垂直向下5,水平向下5?或者它是否遵循传统的UIView模型,这表明它在水平方向上5个点,在垂直方向上上升5个点?
我没有理由认为它不遵循UIView的模型,但我并不积极,我想确定.
我最近一直在UIKit Dynamics和它一起工作,很棒!但是我遇到的Core Animation也提供了类似的功能UIKit Dynamics.有人可以帮助我区分这两者.基本上我需要区分何时使用Core Animation以及何时使用UIKit Dynamics.
我正在尝试手动更改UIDynamics视图的旋转,但视图的旋转始终在更新后重置.该文件说,该UIDynamicAnimator的updateItemUsingCurrentState:方法应该更新项目的位置和旋转,而只是位置更新.
我创建了一个简短的示例,其中方形视图从屏幕上掉落,触摸后应将其定位到触摸位置并旋转到45度.但是,不会发生旋转(有时可以看到旋转几分之一秒,但之后会再次重置):
#import "ViewController.h"
@interface ViewController ()
{
UIDynamicAnimator* _animator;
UIView* _square;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_square = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
_square.backgroundColor = [UIColor grayColor];
[self.view addSubview:_square];
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[_square]];
gravityBehavior.magnitude = 0.1;
[_animator addBehavior:gravityBehavior];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
_square.center = [touch locationInView:self.view];
NSLog(@"transform before rotation: %@", …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个视图,其中一些项目沿着正常的重力矢量落下,而其他项目则沿着相反的矢量落下
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self];
// Normal Gravity
self.gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[ ]];
self.gravityBehavior.gravityDirection = CGVectorMake(0, 1);
[self.animator addBehavior:self.gravityBehavior];
// Inverse Gravity
self.inverseGravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[ ]];
self.inverseGravityBehavior.gravityDirection = CGVectorMake(0, -1);
[self.animator addBehavior:self.inverseGravityBehavior];
Run Code Online (Sandbox Code Playgroud)
我认为那时我可以添加一些项目到一个行为,一些到另一个,但似乎添加第二个引力行为会覆盖第一个?
[self.gravityBehavior addItem: ballA];
[self.inverseGravityBehavior addItem: ballB];
Run Code Online (Sandbox Code Playgroud)
这是真的,如果有,还有另一种方法可以达到这个效果吗?
我意识到精灵套件是游戏的方式,但我想知道是否有办法使用UIDynamicAnimator来设置除重力之外的额外恒定力.我正在制作一个平台游戏,并将重力向下调整.我有屏幕设置的部分来表示箭头键(按屏幕顶部跳转,侧面向左/向右移动......).到目前为止,我已经使用UIPushBehavior来左右跳跃和脉冲.
我想做的是让视图(播放器)在键按下时不断向左或向右移动.我想这将需要第二个横向"重力".我会在触摸屏幕的左侧部分时将其打开,并在触摸释放时关闭.关于替代品的任何想法?显然你不能做2个重力.我在想,如果你不能做两种力量,也许是一种方向为一个方向设置一个恒定的速度.
编辑:我想另一种方式来表达这将是...有没有办法直接设置视图的速度?
uikit-dynamics ×13
ios ×12
objective-c ×4
ios7 ×3
uiview ×3
uikit ×2
animation ×1
cocoa-touch ×1
game-engine ×1
iphone ×1
swift ×1