如何限制uilabel仅在特定帧内拖动?

时间:2012-06-07 06:05:41

标签: iphone uilabel uigesturerecognizer pan uipangesturerecognizer

我在imageview中添加了一个标签,并添加了Pangesture用于拖动标签。这个代码标签在整个范围内拖动。但我想限制uiimageview框架内的标签拖动。 我怎样才能实现这一目标?添加标签和手势的代码如下所示。

lblQuote=[[UILabel alloc]init];


        lblQuote.frame=CGRectMake(130,380, 400,100);
        lblQuote.userInteractionEnabled=TRUE;
        lblQuote.backgroundColor=[UIColor clearColor];
        lblQuote.userInteractionEnabled=TRUE;
        lblQuote.lineBreakMode=UILineBreakModeWordWrap;
        lblQuote.font=[UIFont systemFontOfSize:40.0];    
        lblQuote.tag=500;
        lblQuote.text=@"";




        CGSize maximumLabelSize = CGSizeMake(296,9999);

        CGSize expectedLabelSize = [strQuote sizeWithFont:lblQuote.font 
                                        constrainedToSize:maximumLabelSize 
                                            lineBreakMode:lblQuote.lineBreakMode]; 




        //adjust the label the the new height.
         int nooflines=expectedLabelSize.height/16.0;
        lblQuote.numberOfLines=nooflines;

        // CGRect newFrame = lblQuote.frame;
        //newFrame.size.height = expectedLabelSize.height;
        // yourLabel.frame = newFrame;

        lblQuote.textAlignment=UITextAlignmentCenter;


        UIPanGestureRecognizer *gesture = [[[UIPanGestureRecognizer alloc] 
                                            initWithTarget:self 
                                            action:@selector(labelDragged:)] autorelease];
        [lblQuote addGestureRecognizer:gesture];


- (void)labelDragged:(UIPanGestureRecognizer *)gesture
{
    UILabel *label = (UILabel *)gesture.view;
    CGPoint translation = [gesture translationInView:label];

    // move label
    label.center = CGPointMake(label.center.x + translation.x, 
                               label.center.y + translation.y);

    // reset translation


    [gesture setTranslation:CGPointZero inView:label];
}

我尝试在触摸上移动标签event.code如下:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *touch = [touches anyObject];
    CGPoint pointMoved = [touch locationInView:imgView2];  
    lblQuote.frame=CGRectMake(pointMoved.x, pointMoved.y, lblQuote.frame.size.width, lblQuote.frame.size.height);



}

但是移动并不像平移手势识别器那样平滑。有时触摸是在另一个方向上,并且在某个其他方向上标记移动,有时比触摸更多或更少的移动。

1 个答案:

答案 0 :(得分:4)

这完全取决于你的逻辑,虽然我为你写了一个代码,希望这会对你有所帮助!! 确保您的UILabel UserIntraction设置为YES;并使用触摸开始和触摸移动的方法而不是pangesture ....现在看到这个

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = [[event allTouches]anyObject];
  if([touch view] == lblName)
  {
    NSLog(@"touch on label");
    CGPoint pt = [[touches anyObject] locationInView:lblName];
    startLocation = pt;
    // startLocation is a CGPoint declare globaly in .h..and lblName is your UILabel
  }
}

- (void) touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event 
{
   UITouch *touch = [[event allTouches]anyObject];
   if([touch view] == lblName)
   {
     CGPoint pt = [[touches anyObject] previousLocationInView:lblName];
     CGFloat dx = pt.x - startLocation.x;
     CGFloat dy = pt.y - startLocation.y;
     CGPoint newCenter = CGPointMake(lblName.center.x + dx, lblName.center.y + dy);


    //now put if condition for dragging in specific area

    CGFloat min_X = lblName.center.x + dx - lblName.frame.size.width/2.0;
    CGFloat max_X = lblName.center.x + dx + lblName.frame.size.width/2.0;
    CGFloat min_Y = lblName.center.y + dy - lblName.frame.size.height/2.0;
    CGFloat max_Y = lblName.center.y + dy + lblName.frame.size.height/2.0;

    if((min_X >= imageView.frame.origin.x && max_X <=  imageView.frame.origin.x +  imageView.frame.size.width) && (min_Y >=  imageView.frame.origin.y && max_Y <=  imageView.frame.origin.y +  imageView.frame.size.height))
    {
        lblName.center = newCenter;
    }
  }
}