В подклассе UIButton я прикрепляю UIButton к UIAttachmentBehavior, который позволяет пользователю перетаскивать кнопку по экрану пальцем.Использование CGAffineTransformScale с UIAttachmentBehavior (UIDynamicAnimator)
В - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Я добавляю кнопку в UIAttachmentBehavior, а затем добавляю поведение к UIDynamicAnimator. Во время - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
я обновляю привязку устройства UIAttachmentBehavior к точке касания; это создает желаемый эффект перетаскивания.
Теперь я хочу использовать CGAffineTransformScale, чтобы увеличить размер кнопки при начале касания, чтобы пользователь мог видеть кнопку под их пальцем. Моя проблема в том, что преобразование, которое я применяю с CGAffineTransformScale, сразу же написано вторым, я добавляю поведение вложения. Результатом является быстрое мерцание кнопки масштабирования, но затем возвращается к исходному размеру.
Я попробовал [_animator removeAllBehaviors]
перед применением CGAffineTransformScale, а затем добавил поведение назад. Я также попробовал [_animator updateItemUsingCurrentState:self]
после применения CGAffineTransformScale, как раз перед добавлением поведения вложения. Ничто не решает проблему.
ОБНОВЛЕНИЕ 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];
}
вы пытались добавить UIImageView подвида к кнопке, и применяя ваши преобразования к слою этого подвид, и, таким образом, оставляя свое поведение, чтобы иметь свой путь с помощью кнопки, то подвью будет использовать его преобразование поверх этого? – HalR