1

UIImageView をサブクラス化して、ユーザーの指で画像をドラッグするか、スライダーを使用して画像の回転を設定して、画像を回転できるようにしました。

これは最初に使用したときはすべて正常に機能しますが、ユーザーが画像を回転させてからデバイスの向きを変えると、画像のサイズが大幅に台無しになります.小さくなります。

UIImageView の autoresizingMask を none に設定すると、問題はなくなりますが、そうすると、デバイスの回転時にビューを手動で移動/サイズ変更する必要があります。

次のコードは、ほとんどの作業を行います。

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
    self.spinInProgress = NO;
    if (!self.spinnable || [[event allTouches] count]>1) {
        [super touchesBegan:touches withEvent:event];
        return;
    }
    UITouch *touch = (UITouch*)[touches anyObject];

    //check that touch is within radius of the circle
    float radius = MIN(self.frame.size.height, self.frame.size.width);
    radius = radius / 2;
    CGPoint centre = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);

    CGPoint posInView = [touch locationInView:self];

    float x = posInView.x;
    float y = posInView.y;
    float centre_x = centre.x;
    float centre_y = centre.y;


    if ((powf(x - centre_x, 2) + powf(y - centre_y, 2)) > powf(radius, 2))
        return; //not within the circle..

    //so now doing the work
    self.spinInProgress = YES;

    //stop the spinning if it is doing so
    if (spinTimer!=nil && [spinTimer isValid]){
        [spinTimer invalidate];
        spinTimer = nil;
    }

    //store the current touch as the previous touch position for now for future calculation when touch moves
    CGPoint previousPosition = [touch locationInView:self.superview];

    CGPoint lowerLeft = self.frame.origin;
    CGSize size = self.frame.size;

    //find the centre of the image (really should cache this!)

    centreX = (size.width/2) + lowerLeft.x;
    centreY = (size.height/2) + lowerLeft.y;

    startX = previousPosition.x;
    startY = previousPosition.y;

    //work out the angle of the current touch
    float startdx = previousPosition.x - centreX;
    float startdy = previousPosition.y - centreY;
    startAngle = atan2(startdx, startdy) *180/M_PI;

    startAngle += self.currentAngle;

    [super touchesBegan:touches withEvent:event];


}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    if (!self.spinInProgress) {
        [super touchesMoved:touches withEvent:event];
        return;
    }

    UITouch *touch = (UITouch*)[touches anyObject];
    //work out the current position of the touch
    CGPoint currentPosition = [touch locationInView:self.superview];

    //calculate the angle
    float dx = currentPosition.x - centreX;
    float dy = currentPosition.y - centreY;

    float newangle = atan2(dx,dy) * 180/ M_PI;

    float rotateangle = startAngle - newangle;

    //float movedAngle = rotateangle - currentAngle;

    if (rotateangle > self.currentAngle){
        clockSpin = YES;
    } else {
        clockSpin = NO;
    }

    if (rotateangle>360)
        rotateangle = rotateangle-360;

    if (rotateangle<0)
        rotateangle = fabs(rotateangle);

    self.currentAngle = rotateangle;

    lastMove = [event timestamp]; 

    [super touchesMoved:touches withEvent:event];
}

-(void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
    [self stop:self];
    self.spinInProgress = NO;
    [super touchesEnded:touches withEvent:event];

}

-(void)setCurrentAngle:(float)currentAngle
{

    [self willChangeValueForKey:@"currentAngle"];
    __currentAngle = currentAngle;
    [self didChangeValueForKey:@"currentAngle"];

    CGAffineTransform trans = CGAffineTransformMakeRotation(self.currentAngle*DEGREES_TO_RADIANS);

    self.transform = trans;

}

最も重要なビットは setCurrentAngle であると思いますが、それでうまくいきますが、コンテキストを提供するために残りを投稿する必要があると思いました。

あなたが与えることができるかもしれないどんな助けも大歓迎です!!

ありがとう

リチャード

4

1 に答える 1