【问题标题】:Dragging UIImageView from UIScrollView to another view将 UIImageView 从 UIScrollView 拖到另一个视图
【发布时间】:2013-02-26 15:15:15
【问题描述】:

我有 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];
}

【问题讨论】:

  • 嗯,有趣的问题。在滚动视图上尝试 setClipsToBounds:NO 看看它是否有所作为。
  • 在编码之前,您希望应用程序如何知道拖动其中一个子视图和拖动以滚动之间的用户意图差异?也许使用两根手指拖动来拖动子视图?
  • @EgeAkpinar 如果您关闭剪辑,即使这样可行,也会有问题,因为一旦它“关闭”滚动视图,您可能不希望它在滚动视图滚动时移动。最重要的是,您只想将其从滚动视图中删除并将其添加到您要放置它的视图中。
  • 怎么会,当构图子视图时,y 在循环中前进 35px,但视图是 75px 宽?如果你在它们之间留出空间,也许我们可以说在那个空白处拖动 == 滚动?
  • @danh , Y 只是用于将多个图像添加到滚动视图中。我使用了垂直滚动视图..

标签: iphone ios uiscrollview cgpoint


【解决方案1】:

几个观察:

  1. 当将它拖出滚动视图时,您希望将其从滚动视图中移除并将其添加到例如self.view。然后您将执行addSubview 并相应地调整坐标:

    newCenter = [self.view convertPoint:newCenter fromView:imageView.superview];
    [self.view addSubview:imageView];
    imageView.center = newCenter;
    
  2. 确保将滚动视图的 clipsToBounds 设置为 NO,以便在将其拖出时继续看到它。

  3. 注意,我已将其更改为引用 imageView.superview 而不是滚动视图。如果您在其中保留滚动视图引用,则必须添加条件检查以确保图像视图尚未从滚动视图中移出。

【讨论】:

    【解决方案2】:

    我在 cmets 中有几个 UI 问题要问你,但@Rob 是正确的,让视图在层次结构中移动的关键是在层次结构中实际移动它。当拖动开始时...

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

    手势识别器应该保持原样。

    【讨论】:

      【解决方案3】:

      这里是拖动方式

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

      【讨论】:

      • 您的答案中的[pageOriginalContainer frame]vew 是什么?
      • 拖动没问题..但无法将图像添加到AcceptingView.我这样使用..`[AcceptingView addSubview:imageView]'
      • @user1980105 因为 imageView 的框架已更改,同时将其添加到 AcceptingView 您应该在更改之前使用 bounds 属性将 imageView 的框架更改为 AcceptingView 的坐标
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多