Сделайте UIView перетаскиваемым пальцем
У меня есть mainViewController
но у меня есть маленький UIView
внутри, который активируется при нажатии на MKAnnotationView
в MKMapKit
так что мне нужно UIView
быть перетаскиваемым в любой части экрана.
Пример скриншота моего приложения:
Круг является примером точки, я полагаю, я могу перетащить для любой точки "маленького" UIView.
Я пытался с помощью UITapGestureRecognizer
но это не сработало, так как мой код был недостаточно хорош, и я не мог сделать его перетаскиваемым, потому что это только касание, а не касание и перемещение.
Я надеюсь, что вы можете мне помочь.
4 ответа
- использование
UIPanGestureRecognizer
вместоUITapGestureRecognizer
- Задавать
userInteractionEnabled = YES
на ваш взгляд - Просмотрите этот хороший урок о распознавателях жестов: штрихи. Есть хороший пример перетаскивания видов.
Для создания перетаскиваемых и изменяемого размера UIView
Этот пример (с исходным кодом) действительно полезен для вас.
А также прочитайте этот документ и этот документ UIPanGestureRecognizer
Отредактировано после рецензии @borrrden
UIPanGestureRecognizer
подходит. В вашей функции обработчика проверьте это state
переменная.
typedef enum {
UIGestureRecognizerStatePossible,
UIGestureRecognizerStateBegan, // this will be the value on touch
UIGestureRecognizerStateChanged, // ~ on drag
UIGestureRecognizerStateEnded, // ~ on end of touch event
UIGestureRecognizerStateCancelled,
UIGestureRecognizerStateFailed,
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
} UIGestureRecognizerState;
Я использую это для масштабирования и перетаскивания UIView в моем приложении.
1) Сначала убедитесь, что добавили следующее в вашу реализацию и подключите выходы к вашим представлениям в раскадровке.
#import <QuartzCore/QuartzCore.h>
@interface yourclass () {
BOOL isDragging;
}
@property (weak, nonatomic) IBOutlet UIImageView *outletMainView; // View that contains the view we want to drag
@property (weak, nonatomic) IBOutlet UIImageView *outletRedDot; // The view we want to drag in the main view
Когда начинается касание, я немного масштабирую вид, когда пользователь касается конкретного вида, здесь это красная точка
// ANIMATE RED DOT WHEN START DRAGING IT
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.outletMainView];
CGRect redDotRect = [self.outletRedDot frame];
if (CGRectContainsPoint(redDotRect, touchLocation)) {
isDragging = YES;
NSLog(@"Red Dot tapped!");
[UIView animateWithDuration:0.2
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.outletRedDot.transform = CGAffineTransformMakeScale(1.75, 1.75);
}
completion:^(BOOL finished) {
}];
} else {
return;
}
}
2) Затем я устанавливаю вид так, чтобы он следовал за точкой пальца
// ANIMATE AND MOVE RED DOT WHEN WE DRAG IT
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.outletMainView];
if (isDragging) {
[UIView animateWithDuration:0.0f
delay:0.0f
options:(UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut)
animations:^{
self.outletRedDot.center = touchLocation;
NSLog(@"X: %0.2f Y: %0.2f",touchLocation.x-redDotStartCenter.x, redDotStartCenter.y-touchLocation.y);
}
completion:NULL];
}
}
3) Наконец, когда перетаскивание заканчивается, вид сбрасывается в исходный масштаб
// RESET RED DOT WHEN WE STOP DRAGGING
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.outletMainView];
CGRect redDotRect = [self.outletRedDot frame];
if (CGRectContainsPoint(redDotRect, touchLocation)) {
[UIView animateWithDuration:0.1
delay:0.0
options:0
animations:^{
self.outletRedDot.transform = CGAffineTransformMakeScale(1.0, 1.0);
}
completion:^(BOOL finished) {
}];
}
isDragging = NO;
}