在 UIButton 的子类中,我将 UIButton 附加到 UIAttachmentBehavior 上,让用户可以用手指在屏幕上拖动按钮。
在 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
中,我将按钮添加到 UIAttachmentBehavior,然后将行为添加到 UIDynamicAnimator。在 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
期间,我将 UIAttachmentBehavior 的 anchor 更新到接触点;这将创建所需的拖动效果。
现在我希望使用 CGAffineTransformScale 在触摸开始时增加按钮的大小,以便用户可以在手指下看到按钮。 我的问题是,我使用 CGAffineTransformScale 应用的转换在我添加附件行为的第二次被立即覆盖。结果是按钮快速闪烁放大,但随后又恢复到原始大小。
我在应用 CGAffineTransformScale 之前尝试过 [_animator removeAllBehaviors]
,然后将行为添加回来。在应用 CGAffineTransformScale 之后,就在添加附件行为之前,我还尝试了 [_animator updateItemUsingCurrentState:self]
。都不解决问题。
UPDATE 1 :考虑下面 HalR 的回答,我决定尝试在每次触摸时应用比例变换。因此,我将 CGAffineTransformScale 调用添加到 touchesMoved:
和 touchesEnded
。我使用 CGAffineTransformScale vs CGAffineTransformMakeScale 因为它允许我保留附件行为添加的轻微旋转。它让我离得更近了。该按钮现在可以在缩放时在屏幕上移动。虽然它并不完美。当您不在屏幕上移动时会出现闪烁,如果您停止移动但保持触摸,按钮将恢复到原始大小。差不多了……有什么建议吗?
这是我的 更新的 代码:
@interface DragButton : UIButton < UIDynamicAnimatorDelegate >
#import "DragButton"
#import <QuartzCore/QuartzCore.h>
@implementation DragButton
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.referenceView];
self.transform = CGAffineTransformMakeScale(1.5, 1.5);
_touchAttachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:self attachedToAnchor:touchLocation];
[_animator addBehavior:_touchAttachmentBehavior];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.referenceView];
self.transform = CGAffineTransformScale(self.transform, 1.5, 1.5);
_touchAttachmentBehavior.anchorPoint = touchLocation;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
self.transform = CGAffineTransformScale(self.transform, 1.5, 1.5);
[_animator removeBehavior:_touchAttachmentBehavior];
}
最佳答案
UIAttachmentBehavior
如何影响 View ?
它通过修改 View 的变换来实现。
在此 Ray Wenderlich tutorial 中,Colin Eberhardt 记录了 View 受行为影响时的转换。
即使从不设置或直接修改变换,它也会随着行为移动 View 而发生变化。
所以你不能设置你的转换,并希望它保持设置,因为它是由行为设置的。
在旁注中,如果您尝试将变换设置为按 1.5 缩放,则应使用以下命令:
self.transform = CGAffineTransformMakeScale(1.5, 1.5);
否则,每次调用
touchesBegan
时,它都会再增长 50%。在 UIDynamicAnimator 的文档中,它说:
因此,只需在添加行为后调用您的转换,然后调用 updateItemUsingCurrentState:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.referenceView];
_touchAttachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:self attachedToAnchor:touchLocation];
[_animator addBehavior:_touchAttachmentBehavior];
self.transform = CGAffineTransformMakeScale(1.5, 1.5);
[_animator updateItemUsingCurrentState:self];
}
关于ios - 使用 CGAffineTransformScale 和 UIAttachmentBehavior (UIDynamicAnimator),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19969185/