iPhone / iOS: как реализовать перетаскивание для подпредставлений Scrollview? - PullRequest
10 голосов
/ 15 марта 2012

У меня горизонтальная прокрутка в UIViewController, где у меня много изображений в небольших размерах.Я держу изображения в режиме прокрутки, потому что изображений больше, поэтому пользователь может прокручивать по горизонтали и выбирать изображения.Но проблема в том, что мне нужно выбрать изображение и перетащить его в UIViewController представление.Но, поскольку изображения находятся в режиме прокрутки, перетаскивание изображений в представление UIViewcontroller не работает, также не обнаруживаются события касания.Пожалуйста ПРИМЕЧАНИЕ : Если у меня нет прокрутки, но я просто сохраняю изображения в виде UIViewcontroller, перетаскиваю изображения на одном экране, это работает очень хорошо

Как я могу решить эту проблему, когда мне нужно иметь скролл-просмотр и перетаскивать изображения, любые советы / помощь, пожалуйста?

Ответы [ 5 ]

6 голосов
/ 17 марта 2012

Привет, Гетси,

Я не собираюсь предоставлять вам код напрямую, но дам вам представление, как с этим справиться.

Вы можете управлять этим способом, Когда вы касаетесь своегообъект в scrollView в то время или когда вы перемещаете этот объект, перетаскивая его, отключите прокрутку на myScroll.scrollEnabled = NO;

Затем, когда в endTouch вы можете включить прокрутку на myScroll.scrollEnabled = YES; Таким образом, вы можете управлять перемещением объектав свитке надеюсь, что вы получили логику.

Вот демонстрационный код: Перетаскивание с ScrollView .которая имеет ту же логику, что и Disabling просмотр с прокруткой на touchesMoved: и Enabling просмотр с прокруткой на touchesEnded:.

3 голосов
/ 23 марта 2012

Я реализовывал это поведение раньше, без какого-либо подкласса.

Я использовал canCancelContentTouches = NO из UIScrollView, чтобы убедиться, что обработчик подпредставлений там затрагивает сам по себе.Если было затронуто подпредставление (в вашем случае изображение), я переместил вид из прокрутки в суперпредставление и начал отслеживать его перетаскивание.(Вы должны вычислить правильные координаты в новом суперпредставлении, чтобы оно оставалось на месте).

После завершения перетаскивания я проверил, достигнута ли целевая область, в противном случае я переместил ее обратно в представление прокрутки.Если это недостаточно подробно, я мог бы опубликовать некоторый код.

Хорошо, вот мой пример кода: Github: JDDroppableView

1 голос
/ 23 марта 2012

Getsy,

Попробуйте код для перетаскивания объектов:

-(void)dragAndDropWithGesture {

UILongPressGestureRecognizer *downwardGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dragGestureChanged:)];
[scrollViewAlfabeto addGestureRecognizer:downwardGesture];
    for (UIGestureRecognizer *gestureRecognizer in myscrollView.gestureRecognizers)
    {
       [gestureRecognizer requireGestureRecognizerToFail:downwardGesture];
    }
}

- (void) dragGestureChanged:(UIPanGestureRecognizer*)gesture
{
CGPoint point = [gesture locationInView:scrollViewAlfabeto];

if (gesture.state == UIGestureRecognizerStateBegan) 
{

    [imageViewToMove removeFromSuperview];
    [self.view addSubview:imageViewToMove];

    UIView *draggedView = [myscrollView hitTest:point withEvent:nil];
    if ([draggedView isKindOfClass:[UIImageView class]])
    {
        imageViewToMove = (UIImageView*)draggedView;
    }
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
    imageToMove.center = point;
}
else if (gesture.state == UIGestureRecognizerStateEnded     ||
         gesture.state == UIGestureRecognizerStateCancelled ||
         gesture.state == UIGestureRecognizerStateFailed)
{
    // Determine if dragged view is in an OK drop zone
    // If so, then do the drop action, if not, return it to original location

    NSLog(@"point.x final:%f", point.x);
    NSLog(@"point.y final:%f", point.y);

    if (CGRectContainsPoint(goal.frame, point)){
        imageToMove.frame = CGRectMake(167, 159, 100, 100);
    }

    else{

        [imageToMove removeFromSuperview];
        [myscrollView addSubview:imageToMove];
        [imageToMove setFrame:CGRectMake(12, 38, 100, 100)];
        imageToMove = nil;



    }
}

}

Пусть этот код поможет вам.

0 голосов
/ 06 апреля 2012

Я создал пример, который иллюстрирует, как перетаскивать между двумя или более представлениями: http://www.ancientprogramming.com/2012/04/05/drag-and-drop-between-multiple-uiviews-in-ios/

Я посчитал хорошей идеей зарегистрировать распознаватель жестов в режиме, отличном от вида, который перетаскивается. Это обеспечит продолжение жестов, даже если перетаскиваемый вид изменит свой «родительский» вид.

Может быть, это может дать вдохновение

0 голосов
/ 23 марта 2012

Для аналогичной проблемы я создал подкласс UIScrollView следующим образом: PoliteScrollView передает сенсорные сообщения своим подпредставлениям, когда он определяет, что они перетаскиваются.

@interface PoliteScrollView : UIScrollView

// number of pixels perpendicular to the scroll views orientation to make a drag start counting as a subview drag
// defaults to 1/10 of the scroll view's width or height, whichever is smaller
@property(nonatomic,assign) CGFloat subviewDraggingThreshold;
// yes when a subview is being dragged
@property(nonatomic,assign) BOOL isDraggingSubview;
// the subview being dragged
@property(nonatomic,strong) UIView *draggingSubview;

@end

@protocol PoliteScrollViewDelegate <NSObject>
@optional
- (void)scrollView:(PoliteScrollView *)scrollView subviewTouchesBegan:(NSSet *)touches;
- (void)scrollView:(PoliteScrollView *)scrollView subviewTouchesMoved:(NSSet *)touches;
- (void)scrollView:(PoliteScrollView *)scrollView subviewTouchesEnded:(NSSet *)touches;
@end

Основная идея проекта заключается в том, чтобы перетаскиватьвид прокрутки неоднозначен.Пользователь прокручивает или перетаскивает подпредставление?Представление PoliteScroll обрабатывает это, предоставляя две вещи: (1) понятие ориентации (горизонтальное, если оно длиннее его ширины, в противном случае вертикальное) и (2) пороговое расстояние для того, что представляет собой перетаскивание в направлении, перпендикулярном его ориентации.(по умолчанию 1/10 ширины или высоты).

Я вставил этот и несколько других файлов в вставку , содержащую следующее:

  • PoliteScrollView .h и .m
  • DraggableImageView.h и .m - это меняет свою позицию, когда он получает сенсорные сообщения.
  • ViewController.m - что демонстрирует два в комбинации.

Чтобы объединить их в проекте, вставьте корзину для вставки в файлы с соответствующим именем, добавьте раскадровку с PoliteScrollView (не забудьте установить его делегат), добавьте несколько изображений (ViewController пытается добавить puppy0.jpeg в puppy4.jpeg.

...