UIAttachmentBehavior 中的长度是如何确定的?

Posted

技术标签:

【中文标题】UIAttachmentBehavior 中的长度是如何确定的?【英文标题】:How is length in UIAttachmentBehavior determined? 【发布时间】:2014-05-10 18:22:23 【问题描述】:

UIAttachmentView中length属性的documentation如下:

如果您愿意,可以在创建附件后使用此属性调整附件长度。系统会根据您初始化附件的方式自动设置初始长度。

我的问题是关于最后一句话:初始长度是如何计算的?

【问题讨论】:

【参考方案1】:

初始长度由您首次创建附件行为时选择的锚点决定。比如调用initWithItem:offsetFromCenter:attachedToAnchor:offsetFromCenterattachedToAnchor的距离。

例如,考虑这样的手势识别器:

- (void)handlePan:(UIPanGestureRecognizer *)gesture

    static UIAttachmentBehavior *attachment;
    CGPoint location = [gesture locationInView:self.animator.referenceView];

    if (gesture.state == UIGestureRecognizerStateBegan) 
        attachment = [[UIAttachmentBehavior alloc] initWithItem:self.viewToAnimate attachedToAnchor:location];
        NSLog(@"before adding behavior to animator: length = %.0f", attachment.length);       // this says zero, even though it's not really
        [self.animator addBehavior:attachment];
        NSLog(@"after adding behavior to animator:  length = %.0f", attachment.length);       // this correctly reflects the length
     else if (gesture.state == UIGestureRecognizerStateChanged) 
        attachment.anchorPoint = location;
        NSLog(@"during gesture: length = %.0f", attachment.length);       // this correctly reflects the length
     else if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateCancelled) 
        [self.animator removeBehavior:attachment];
        attachment = nil;
    

此报告:

2014-05-10 14:50:03.590 MyApp [16937:60b] 在向动画师添加行为之前:长度 = 0 2014-05-10 14:50:03.594 MyApp [16937:60b] 向动画师添加行为后:长度 = 43 2014-05-10 14:50:03.606 MyApp [16937:60b] 在手势期间:长度 = 43 2014-05-10 14:50:03.607 MyApp [16937:60b] 在手势期间:长度 = 43

如果您在实例化UIAttachmentBehavior 之后(但在将行为添加到动画师之前)立即查看length,则length 似乎为零。但是,一旦您将行为添加到动画师,length 就会正确更新。

【讨论】:

我在initWithItem:offsetFromCenter:attachedToAnchor: 之后记录了一个 UIAttachmentBehavior 实例的长度,该值结果为 0,而实际行为表明并非如此。 @DanielDuan 将行为添加到动画师后,length 就会正确更新。查看代码示例和日志输出。

以上是关于UIAttachmentBehavior 中的长度是如何确定的?的主要内容,如果未能解决你的问题,请参考以下文章

将 CGAffineTransformScale 与 UIAttachmentBehavior (UIDynamicAnimator) 一起使用

结合 UIAttachmentBehavior 和 UICollisionBehavior

使用 UIAttachmentBehavior 和自动布局约束拖动 UIView

如何将多个 UIDynamicItem 相互附加

为啥在 .addObserver 中以 NSException 类型的未捕获异常终止

设置delphi中的edit输入固定长度字段!