自定义手势用于增加视图的大小

时间:2013-11-21 05:23:05

标签: ios objective-c uigesturerecognizer

如何编写自定义手势以增加视图的大小(即)在原点和视图的大小方向上。

示例:

  1. 用户应该触摸任何一个角落的视图。靠近原点侧或观察端侧。
  2. 示例:视图帧大小为(100,100,200,200).,最小触摸距离为任意一侧15像素。

    因此,如果用户触摸位置为(X=15,Y=40)

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    

    方法意味着触摸原点附近。

    如果用户触摸位置为(X=15, Y=190) in

    ,则相同
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    

    方法意味着触摸接近尺寸方。

    我的代码:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    
    {
    
    [super touchesBegan:touches withEvent:event];
    if([touches count] != self.touchMinimumCount ||
       [[touches anyObject] tapCount] > self.tapMinimumCount)
    {
        self.state = UIGestureRecognizerStateFailed;
        return;
    }
    self.startPoint = [[touches anyObject] locationInView:self.view];
    self.viewFrame = self.view.frame;
    
    if(((self.startPoint.x - self.view.bounds.origin.x) <= self.minimumTouchDistance) ||
       ((self.startPoint.y - self.view.bounds.origin.y) <= self.minimumTouchDistance) ||
       ((ABS(self.startPoint.x - self.view.bounds.size.width)) <= self.minimumTouchDistance) ||
       ((ABS(self.startPoint.y - self.view.bounds.size.height)) <= self.minimumTouchDistance))
    {
        self.state = UIGestureRecognizerStatePossible;
        if(((self.startPoint.x - self.view.bounds.origin.x) <= self.minimumTouchDistance) ||
           ((self.startPoint.y - self.view.bounds.origin.y) <= self.minimumTouchDistance) )
        {
            self.currentTouchPosition = touchPositionIsOrigin;
        }
        else if(((ABS(self.startPoint.x - self.view.bounds.size.width)) <= self.minimumTouchDistance) ||
                ((ABS(self.startPoint.y - self.view.bounds.size.height)) <= self.minimumTouchDistance))
        {
            self.currentTouchPosition = touchPositionIsSize;
        }
    }
    else
    {
        self.state = UIGestureRecognizerStateFailed;
    }
    }
    

    如果只触摸触摸距离,我的手势可能会设置状态。

    现在我想根据用户手指移动来调整视图框的大小。

    1. 如果用户触摸原点侧并向左方向移动意味着,想要更改视图的原点x,宽度也要增加。
    2. 如果用户触摸原点侧并向顶部方向移动意味着,想要更改视图的原点和宽度也要增加。
    3. 如果用户触摸原点侧并朝右方向移动,则意味着要更改视图的origin.x.
    4. 如果用户触摸原点侧并向底部方向移动,则意味着要更改视图的原点。
    5. 如果用户触摸尺寸侧并朝左方向移动,则意味着减小视图的宽度。
    6. 如果用户触摸尺寸侧并向顶部方向移动,则意味着要降低视图的高度。
    7. 如果用户触摸尺寸侧并朝向右方向移动,则意味着增加视图的宽度。
    8. 如果用户触摸尺寸侧并朝向底部方向移动,则意味着增加视图的高度。
    9. 这一切都会根据移动时用户手指在该视图中的变化而变化。

      我的代码:

      - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
      
      {
      
      [super touchesMoved:touches withEvent:event];
      if(self.state == UIGestureRecognizerStateFailed) return;
      direction currentDirection;
      CGPoint currentLocation = [[touches anyObject] locationInView:self.view];
      if(self.state == UIGestureRecognizerStatePossible ||
         self.state == UIGestureRecognizerStateChanged)
      {
          if((currentLocation.x - self.startPoint.x) > 0)
          {
              currentDirection = directionRight;
              self.state = UIGestureRecognizerStateChanged;
              if(self.currentTouchPosition == touchPositionIsOrigin)
              {
                  distanceInOriginX = // need to implement. 
                  distanceInSizeX = // need to implement. 
              }
              else if(self.currentTouchPosition == touchPositionIsSize)
              {
                  distanceInSizeX = // need to implement. 
              }
          }
          else if((currentLocation.x - self.startPoint.x) < 0)
          {
              currentDirection = directionLeft;
              self.state = UIGestureRecognizerStateChanged;
              if(self.currentTouchPosition == touchPositionIsOrigin)
              {
                  distanceInOriginX = // need to implement. 
                  distanceInSizeX = // need to implement. 
              }
              else if(self.currentTouchPosition == touchPositionIsSize)
              {
                  distanceInSizeX = // need to implement. 
              }
          }
      
          else if((currentLocation.y - self.startPoint.y) >= 0)
          {
              currentDirection = directionBottom;
              self.state = UIGestureRecognizerStateChanged;
              if(self.currentTouchPosition == touchPositionIsOrigin)
              {
                  distanceInOriginY = // need to implement. 
                  distanceInSizeY = // need to implement.
              }
              else if(self.currentTouchPosition == touchPositionIsSize)
              {
                  distanceInSizeY = // need to implement. 
              }
          }
          else if((currentLocation.y - self.startPoint.y) < 0)
          {
              currentDirection = directionTop;
              self.state = UIGestureRecognizerStateChanged;
              if(self.currentTouchPosition == touchPositionIsOrigin)
              {
                  distanceInOriginY = // need to implement. 
                  distanceInSizeY = // need to implement.
              }
              else if(self.currentTouchPosition == touchPositionIsSize)
              {
                  distanceInSizeY = // need to implement. 
              }
          }
          else
          {
              currentDirection = directionUnknown;
          }
          self.originPoint = CGPointMake(distanceInOriginX, distanceInOriginY);
          self.sizePoint = CGPointMake(distanceInSizeX, distanceInSizeY);
      }
      }
      

      我提到//需要实施。哪里我想要代码来实现我在这一点上提到的功能。所以,请帮忙去做。

      如果我的错误意味着,请分享做同样手势的最佳方法。

      任何一个例子也在这里分享。提前谢谢....

1 个答案:

答案 0 :(得分:0)

如果要缩放视图的大小,请使用 UIPinchGestureRecognizer 。这里给出了一个示例代码

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(scale:)];
    pinchRecognizer.delegate = self;
    [self addGestureRecognizer:pinchRecognizer];

处理程序方法是

#pragma mark - Gesture handling functions



-(void)scale:(UIPinchGestureRecognizer*)recognizer  {

        if ([recognizer state] == UIGestureRecognizerStateBegan) {
            _lastScale = 1.0;
        }

        CGFloat scale = 1.0 - (_lastScale - [recognizer scale]);

        CGAffineTransform currentTransform = self.imgView.transform;
        CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

        self.imgView.transform = newTransform;

        _lastScale = [recognizer scale];

    }