2013-02-26 4 views
1

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

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]; 
} 
+1

Хм интересный вопрос. Попробуйте setClipsToBounds: НЕТ в вашем просмотре прокрутки и посмотрите, не изменилось ли это. –

+0

перед кодированием, как вы хотите, чтобы приложение узнало разницу в намерениях пользователя между перетаскиванием одного из подзонов и перетаскиванием для прокрутки? возможно, используйте перетаскивание пальцем для перетаскивания подвью? – danh

+0

@EgeAkpinar Если вы отключите обрезку, даже если это сработает, это будет проблематично, потому что, когда он «отключен» от просмотра прокрутки, вы, по-видимому, не хотите, чтобы он перемещался по прокручиванию прокрутки. В нижней строке вы просто хотите удалить его из прокрутки и добавить его в представление, на которое вы его отбрасываете. – Rob

ответ

1

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

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

Устройство распознавания жестов должно оставаться неизменным.

2

Несколько наблюдений:

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

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

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

1

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

-(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 
      } 
     } 
    } 
+0

что такое '[pageOriginalContainer frame]' и 'vew' в вашем ответе? – IKKA

+0

@ user1980105 Я отредактировал свой ответ –

+0

ОК спасибо ... – IKKA