在UIButton的子类中,我将UIButton附加到UIAttachmentBehavior,让用户用手指在屏幕上拖动按钮。
在- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
中,我将按钮添加到UIAttachmentBehavior,然后将行为添加到UIDynamicAnimator。在- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
期间,我将UIAttachmentBehavior的锚点更新到触摸点;这会产生所需的拖动效果。
现在我希望使用CGAffineTransformScale在触摸开始时增加按钮的大小,以便用户可以在他们的手指下看到按钮。 我的问题是我在CGAffineTransformScale中应用的转换在第二次添加附件行为时立即被写入。结果是按钮缩放的快速闪烁,但然后它返回到原始大小。
我在应用CGAffineTransformScale之前尝试过[_animator removeAllBehaviors]
,然后再添加行为。在添加附件行为之前,我在应用CGAffineTransformScale之后也尝试了[_animator updateItemUsingCurrentState:self]
。都没有解决问题。
更新1 :考虑下面HalR的答案,我决定尝试每次触摸应用比例变换。因此,我将CGAffineTransformScale调用添加到touchesMoved:
和touchesEnded
。我正在使用CGAffineTransformScale与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];
}
答案 0 :(得分:0)
UIAttachmentBehavior
如何影响视图?
它通过修改视图的变换来实现。
在此Ray Wenderlich tutorial Colin Eberhardt记录变换,因为视图受行为影响。
即使从未设置或直接修改变换,它也会随着行为移动视图而发生变化。
所以你不能设置你的变换,并希望它保持设置,因为它是由行为设置的。
在旁注中,如果您尝试将变换设置为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];
}