Перетаскивание UIImageView из UIScrollView в другое представление

У меня UIScrollView содержит много UIImageViews. Мне нужно перетащить UIImage из UIScrollView в другое представление. Но мой код перетаскивается только в UIScrollView. Я не могу перетащить изображение за пределы scrollView. Пожалуйста, помогите мне .. Мой код ..

for (int i = 0; i < [myArray count]; i++) {
  image = [[UIImageView alloc]initWithFrame:CGRectMake(0, y, 75, 30)];
  image.userInteractionEnabled = YES;
  image.backgroundColor = [UIColor blueColor];

  UIPanGestureRecognizer *panRecg = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(labelDragged:)];
  [image addGestureRecognizer:panRecg];
  y=y+35;

  [gScrollView addSubview:image];
}

-(void)labelDragged:(UIPanGestureRecognizer *)recognizer {
  UIImageView *imageView = (UIImageView *)recognizer.view;
  CGPoint newCenter = [recognizer translationInView:self.view];

  if([recognizer state] == UIGestureRecognizerStateBegan) {     
    beginX = imageView.center.x; 
    beginY = imageView.center.y;
  }

  newCenter = CGPointMake(beginX + newCenter.x, beginY + newCenter.y);

  [imageView setCenter:newCenter];
}

person IKKA    schedule 26.02.2013    source источник
comment
Хм интересный вопрос. Попробуйте setClipsToBounds: NO в вашем просмотре прокрутки и посмотрите, имеет ли это значение.   -  person Ege Akpinar    schedule 26.02.2013
comment
перед кодированием, как вы хотите, чтобы приложение узнало разницу в намерениях пользователя между перетаскиванием одного из вложенных представлений и перетаскиванием для прокрутки? может быть, использовать перетаскивание двумя пальцами для перетаскивания подпредставления?   -  person danh    schedule 26.02.2013
comment
@EgeAkpinar Если вы отключите отсечение, даже если это сработает, это будет проблематично, потому что, если он отключен от режима прокрутки, вы, вероятно, не хотите, чтобы он перемещался при прокрутке прокрутки. В итоге, вы просто хотите удалить его из прокрутки и добавить в представление, в которое вы его перетаскиваете.   -  person Rob    schedule 26.02.2013
comment
почему при кадрировании подвидов y продвигается на 35 пикселей в цикле, но виды имеют ширину 75 пикселей? если вы оставите пространство между ними, может быть, мы могли бы сказать, что перетаскивание в этом пустом пространстве == прокрутка?   -  person danh    schedule 26.02.2013
comment
@danh, Y просто использовал для добавления более одного изображения в режим прокрутки. Я использовал вертикальную прокрутку ..   -  person IKKA    schedule 26.02.2013
comment
@ Роб, ты прав, я знаю об этом, но я думал, что реорганизация иерархии представлений слишком сложна, может быть, он будет в порядке, просто отключив обрезку (вопрос на самом деле не слишком много говорит о том, куда перетаскиваются представления закончится, можно оставить их в режиме прокрутки)   -  person Ege Akpinar    schedule 26.02.2013


Ответы (3)


Пара наблюдений:

  1. При перетаскивании его из режима прокрутки вы хотите удалить его из режима прокрутки и добавить, например, в self.view. Затем вы выполните addSubview и соответствующим образом скорректируете координаты:

    newCenter = [self.view convertPoint:newCenter fromView:imageView.superview];
    [self.view addSubview:imageView];
    imageView.center = newCenter;
    
  2. Убедитесь, что для параметра clipsToBounds для режима прокрутки установлено значение НЕТ, чтобы вы могли видеть его при перетаскивании.

  3. Обратите внимание, я изменил это, чтобы относиться к imageView.superview, а не к просмотру прокрутки. Если вы сохраняете ссылки на scrollview там, вам нужно добавить условные проверки, чтобы убедиться, что представление изображения еще не было перемещено из представления прокрутки.

person Rob    schedule 26.02.2013

У меня есть пара вопросов по пользовательскому интерфейсу для вас в комментариях, но @Rob прав в том, что ключ к созданию видимости перемещения представления по иерархии - это фактическое перемещение его внутри иерархии. Когда начинается перетаскивание ...

CGRect newFrame = [gScrollView convertRect:imageView.frame toView:self.view];
imageView.frame = newFrame;
[self.view addSubview:imageView];

Распознаватель жестов должен остаться нетронутым.

person danh    schedule 26.02.2013

Вот способ перетащить

-(void)labelDragged:(UIPanGestureRecognizer *)recognizer {

{
        UIImageView *imageView=(UIButton *)[recognizer view];
        CGPoint newCenter = [recognizer translationInView:self.view];
        if (recognizer.state==UIGestureRecognizerStateBegan) {
            CGRect rect=[self.view convertRect:[imageView frame] fromView:[imageView superview]];
            beginX = imageView.center.x; 
            beginY = imageView.center.y;
            [vew setFrame:rect];
            [self.view addSubview:vew];
        }
        else
        {
            CGRect rect=imageView.frame;
            newCenter.x=(newCenter.x+Begin.x);
            newCenter.y=(newCenter.y+Begin.y);
            imageView.center=newCenter;
            if (CGRectIntersectsRect(rect, [AcceptingView frame])) {
                [AcceptingView setBackgroundColor:[UIColor lightGrayColor]];//Notifying that the AcceptingView will accept the icon
            }
            else
            {
                //change back to old color
            }
        }
        if (recognizer.state==UIGestureRecognizerStateEnded)
        {
            CGRect rect=[imageView frame];
            if (CGRectIntersectsRect(rect, [AcceptingView frame])) {
                  //your method of adding the Image to acceptView
                 CGRect rect=[acceptView bounds];
                 rect.size=imageView.frame.size;
                 imageView.frame=rect;
                 [AcceptingView addSubView:imageView];
            }
            else//else part is means for if user drop the dragged view somewhere else other than AcceptingView
            {
                   //add image back to scrollView
            }
        }
    }
person vignesh kumar    schedule 26.02.2013
comment
что означает [pageOriginalContainer frame] и vew в вашем ответе? - person IKKA; 27.02.2013
comment
перетаскивание - это нормально .. но не могу добавить изображение в AcceptingView. Я использовал вот так ... `[AcceptingView addSubview: imageView] ' - person IKKA; 27.02.2013
comment
@ user1980105, потому что фрейм imageView изменяется при добавлении этого в ваш AcceptingView, вы должны изменить фрейм imageView на координаты AcceptingView, используя свойство bounds перед изменением - person vignesh kumar; 27.02.2013
comment
давайте продолжим обсуждение в чате - person vignesh kumar; 27.02.2013