在UIView中限制UIImageView内部的Pan Gesture边界

时间:2013-11-26 15:09:32

标签: objective-c

我正在使用以下代码

- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{

    static CGRect originalFrame;

    if (state == UIGestureRecognizerStateBegan)
    {
        originalFrame = recognizer.view.frame;
    }
    else if (state == UIGestureRecognizerStateChanged)
    {

       CGPoint translate = [recognizer translationInView:recognizer.view.superview];
       CGRect newFrame = CGRectMake(fmin(recognizer.view.superview.frame.size.width - originalFrame.size.width, fmax(originalFrame.origin.x + translate.x,0.0)),
                                    fmin(recognizer.view.superview.size.height - originalFrame.size.height, fmax(originalFrame.origin.y + translate.y, 0.0)),
                                    originalFrame.size.width,
                                    originalFrame.size.height);

       recognizer.view.frame = newFrame;

    }else if (state == UIGestureRecognizerStateEnded)
    {
        [self performSelectorInBackground:@selector(ChangeViewAlphaTo1) withObject:nil];
    }
}

1 个答案:

答案 0 :(得分:0)

主要问题是你试图在一行中解决两个约束。

如果遇到问题,请尝试解决问题。大量陈述难以阅读,甚至难以调试。

CGRect newFrame = CGRectMake(fmin(recognizer.view.superview.frame.size.width - originalFrame.size.width, fmax(originalFrame.origin.x + translate.x,0.0)),
                                    fmin(recognizer.view.superview.size.height - originalFrame.size.height, fmax(originalFrame.origin.y + translate.y, 0.0)),
                                    originalFrame.size.width,
                                    originalFrame.size.height);

几乎无法读取,当您在6个月内重新访问此时,您或其他编码人员将无法告诉您尝试做什么。

尝试用......替换那个怪物。

[self translateView:recognizer.view limitedBySuperViewBounds:translate];

突然间,该方法会告诉你你在做什么。

-(void)translateView:(UIView *)aview limitedBySuperViewBounds:(CGPoint)translate
{
    CGRect frameToTranslate = aview.frame;

    CGRect superviewBounds= aview.superview.bounds;

    frameToTranslate.origin.x = frameToTranslate.origin.x + translate.x;

    frameToTranslate.origin.y = frameToTranslate.origin.y + translate.y;

    if (translate.x < 0) {

        frameToTranslate.origin.x = 0;
    }
    else if (CGRectGetMaxX(frameToTranslate) > CGRectGetWidth(superviewBounds)){

        frameToTranslate.origin.x = CGRectGetWidth(superviewBounds) - CGRectGetWidth(frameToTranslate);
    }

    if (translate.y < 0) {

        frameToTranslate.origin.y = 0;
    }
    else if (CGRectGetMaxY(frameToTranslate) > CGRectGetHeight(superviewBounds)){

        frameToTranslate.origin.y = CGRectGetHeight(superviewBounds) - CGRectGetHeight(frameToTranslate);
    }

    aview.frame = frameToTranslate;


}

这不仅仅是我的意见,这是Clean Code