0

Используя некоторый код, я наткнулся на то, что рисует форму круга над изображением. На вытянутой форме круга используются жесты и жесты. Движение формы пересекает размеры UIImageView на остальной части пользовательского интерфейса, который не отображает изображение. Я попытался включить методы, используемые в других примерах, где необходимы ограничения панорамирования и ограничения, чтобы ограничить движение формы круга до границ UIImageView, но не могли заставить их работать. Я понимаю, что мне нужно будет контролировать значения центра и радиуса панорамирования и пинча, чтобы они не пересекали границу UIImageView, но не имеют ни малейшего понятия о том, как это выполнить. Прикрепленный код, который я использую. Спасибо за вашу помощь!Ограничить перемещение формы по размерам UIImageView

-(void)setUpCropTool:(id)sender{ 

    // create layer mask for the image 

    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    self.imageToBeCropped.layer.mask = maskLayer; 
    self.maskLayer = maskLayer; 

    // create shape layer for circle we'll draw on top of image (the boundary of the circle) 

    CAShapeLayer *circleLayer = [CAShapeLayer layer]; 
    circleLayer.lineWidth = 50; 
    circleLayer.fillColor = [[UIColor clearColor] CGColor]; 
    circleLayer.strokeColor = [[UIColor redColor] CGColor]; 
    [self.imageToBeCropped.layer addSublayer:circleLayer]; 
    self.circleLayer = circleLayer; 

    // create circle path 

    [self updateCirclePathAtLocation:CGPointMake(self.imageToBeCropped.bounds.size.width/2.0, self.imageToBeCropped.bounds.size.height/2.0) radius:self.imageToBeCropped.bounds.size.width/2.5]; 

    // create pan gesture 

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
    pan.delegate = self; 
    [self.imageToBeCropped addGestureRecognizer:pan]; 
    self.imageToBeCropped.userInteractionEnabled = YES; 
    self.pan = pan; 

    // create pan gesture 

    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)]; 
    pinch.delegate = self; 
    [self.imageToBeCropped addGestureRecognizer:pinch]; 
    self.pinch = pinch; 

} 

- (void)updateCirclePathAtLocation:(CGPoint)location radius:(CGFloat)radius 
{ 
    self.circleCenter = location; 
    self.circleRadius = radius; 

    UIBezierPath *path = [UIBezierPath bezierPath]; 
    [path addArcWithCenter:self.circleCenter 
        radius:self.circleRadius 
       startAngle:0.0 
        endAngle:M_PI * 2.0 
       clockwise:YES]; 

    self.maskLayer.path = [path CGPath]; 
    self.circleLayer.path = [path CGPath]; 
} 

#pragma mark - Gesture recognizers 

- (void)handlePan:(UIPanGestureRecognizer *)gesture 
{ 
    static CGPoint oldCenter; 
    CGPoint tranlation = [gesture translationInView:gesture.view]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     oldCenter = self.circleCenter; 
    } 

    CGPoint newCenter = CGPointMake(oldCenter.x + tranlation.x, oldCenter.y + tranlation.y); 



     [self updateCirclePathAtLocation:newCenter radius:self.circleRadius]; 



} 

- (void)handlePinch:(UIPinchGestureRecognizer *)gesture 
{ 
    static CGFloat oldRadius; 
    CGFloat scale = [gesture scale]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     oldRadius = self.circleRadius; 
    } 

    CGFloat newRadius = oldRadius * scale; 

    [self updateCirclePathAtLocation:self.circleCenter radius:newRadius]; 
} 


#pragma mark - UIGestureRecognizerDelegate 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if ((gestureRecognizer == self.pan && otherGestureRecognizer == self.pinch) || 
     (gestureRecognizer == self.pinch && otherGestureRecognizer == self.pan)) 
    { 
     return YES; 
    } 

    return NO; 
} 

ответ

0

Попробуйте добавить некоторые дополнительные ограничения в код обработки панорамирования. Возможно, что-то вроде:

if (oldCenter.x + tranlation.x >= superView.frame.size.width - self.circleRadius 
|| oldCenter.x + tranlation.x <= self.circleRadius) 
{ 
    newCenter.x = oldCenter.x; 
} 
else 
{ 
    newCenter.x = oldCenter.x + tranlation.x; 
} 

Это довольно простой пример, надеюсь, что это поможет.

Смежные вопросы