Search code examples
iosobjective-cuser-interfacescale

UIButton - move and scale


I have an UIButton that I've creates programmatically. Actually it should'n be UIButton, I just need to have possibility to mark some area above the image.

So the features I need it - move object and resize it. For this i have 2 methods:

- (void) objMove:(id) sender withEvent:(UIEvent *) event
{
 UIControl *control = sender;
 UITouch *t = [[event allTouches] anyObject];
 CGPoint pPrev = [t previousLocationInView:control];
 CGPoint p = [t locationInView:control];
 CGPoint center = control.center;
 center.x += p.x - pPrev.x;
 center.y += p.y - pPrev.y;
 control.center = center;
}

- (void)objScale:(UIPinchGestureRecognizer *)recognizer
{
 UIView *pinchView = recognizer.view;
 CGRect bounds = pinchView.bounds;
 CGPoint pinchCenter = [recognizer locationInView:pinchView];
 pinchCenter.x -= CGRectGetMidX(bounds);
 pinchCenter.y -= CGRectGetMidY(bounds);
 CGAffineTransform transform = pinchView.transform;
 transform = CGAffineTransformTranslate(transform, pinchCenter.x, pinchCenter.y);
 CGFloat scale = recognizer.scale;
 transform = CGAffineTransformScale(transform, scale, scale);
 transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y);
 pinchView.transform = transform;
 recognizer.scale = 1.0;
}

Scale works ok. Moving looks ok until I change the size of object - when i increase object it become moves slower than finger, and vice versa - if object smaller than original it moves faster than finger. why it works like this?


Solution

  • I think you should get startPoint and startCenter in

     - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
     // get startPoint and startCenter here
    }
    
    - (void) objMove:(id) sender withEvent:(UIEvent *) event
    {
     UIControl *control = sender;
     UITouch *t = [[event allTouches] anyObject];
     CGPoint p = [t locationInView:control];
     startCenter.x += p.x - startPoint.x;
     startCenter.y += p.y - startPoint.y;
     control.center = startCenter;
    }
    

    Change your code like this, maybe it works.

    Your center is current center, p is current point, pPrev is previous point. current center adds previous point moved size is wrong. You should get relative distance, not dynamic distance.