6

私は変換を使用するのが初めてです。そして、彼らがどのように働いているのかまだ混乱しています。

私がやろうとしているのは、UIImageView を特定の角度で回転させることです。しかし、回転した後、画像のサイズが変更され、小さくなります。逆さまにならないように、ImageView のスケーリングも行っています。ImageView が割り当てられたときに、CGRectMake で指定されたサイズを回転して保持する方法は?

    UIImageView *myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(x,y,width,height)];        

    myImageView.contentMode = UIViewContentModeScaleAspectFit;

    [myImageView setImage:[UIImage imageNamed:@"image.png"]];

    myImageView.layer.anchorPoint = CGPointMake(0.5,0.5);

    CGAffineTransform newTransform;

    myImageView.transform = CGAffineTransformMakeScale(1,-1);            

    newTransform = CGAffineTransformRotate(newTransform, 30*M_PI/180);

    [self.window addSubview:myImageView];

どうもありがとう!

4

2 に答える 2

17

わかりました、私はそれを調べると約束したので、ここに私の答えがあります:

私はあなたのシーンとある程度同等のシーンを作成します。次のようにコーディングします。

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width/2-100,
                                                                       self.view.bounds.size.height/2-125,
                                                                       200,
                                                                       250)];

imageView.image = [UIImage imageNamed:@"testimage.jpg"];
imageView.contentMode = UIViewContentModeScaleAspectFill;

/*
 * I added clipsToBounds, because my test image didn't have a size of 200x250px
 */
imageView.clipsToBounds = YES;

[self.view addSubview:imageView];

NSLog(@"frame: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds: %@",[NSValue valueWithCGRect:imageView.bounds]);    

imageView.layer.anchorPoint = CGPointMake(0.5, 0.5);
imageView.transform = CGAffineTransformMakeRotation(30*M_PI/180);

NSLog(@"frame after rotation: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds after rotation: %@",[NSValue valueWithCGRect:imageView.bounds]); 

このコードは、ARCを使用していることを前提としています。追加しない場合

[imageView release];   

最後に。

このコードを使用すると、ログは次のようになります。

[16221:207] frame: NSRect: {{60, 105}, {200, 250}}
[16221:207] bounds: NSRect: {{0, 0}, {200, 250}}
[16221:207] frame after rotation: NSRect: {{10.897461, 71.746826}, {298.20508, 316.50635}}
[16221:207] bounds after rotation: NSRect: {{0, 0}, {200, 250}}    

ご覧のとおり、境界は常に同じです。もちろん、30°C回転させた画像は、手で回転させていない場合よりも幅が広いため、回転によって実際に変化するのはフレームです。また、中心点がビューの実際の中心に設定されているため、フレームの原点も変更されます(左と上に押されます)。画像自体のサイズは変更されないことに注意してください。結果はスケーリングなしで達成できるため、スケール変換は使用しませんでした。

しかし、明確にするために、ここにいくつかの写真があります(0°、30°90°回転): UIImageViewの0°、30°、90°の回転

彼らはすでにかなり似ているように見えますよね?境界とフレームの違いを明確にするために、実際のフレームを描画しました。次のものは本当にそれを明らかにします。すべての画像をオーバーレイし、UIImageViewを回転させた負の角度で回転させたところ、次の結果が得られました。 サイズが変更されないことを示すためにオーバーレイされたUIImageViews

したがって、画像を回転させる方法は非常に簡単です。ここで、実際にフレームを同じままにしておきたいという問題があります。最終フレームに元のフレームのサイズ(この例では幅200、高さ250)を設定する場合は、結果のフレームを拡大縮小する必要があります。しかし、これはもちろん、あなたが望まない画像のスケーリングをもたらします。実際には、フレームを大きくしても問題はないと思います。回転のために、フレームを考慮に入れる必要があることを知っておく必要があります。

つまり、回転後に同じフレームを持つUIImageViewを作成することはできません。これは、UIViewでは不可能です。長方形について考えてみてください。回転させると、回転後は長方形になりませんね。

もちろん、UIImageViewを別のUIView内に配置することもできます。このUIViewは、幅200、高さ250の回転されていないフレームを持ちますが、回転された長方形がオリジナルとは異なる幅と高さ。

これがお役に立てば幸いです。:)

于 2012-05-13T16:38:07.437 に答える
0

UIImageView が UIView から継承する contentMode を設定しないでください。選択した UIViewContentMode に従って、スケーリング、変換、デバイスの回転に応じてフレームが変更されます。

また、回転したいだけの場合は、次を使用してフレームを変更できます:-

[UIView beginAnimations:@"Rotate" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    CGRect frame=yourView.frame;
    frame.origin.y+=distance you want to rotate;
    yourview.frame=frame;
    [UIView commitAnimations];
}

アニメーションが必要ない場合は、フレームを変更するだけです

これを使ってみてください:-

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 0.5f;            
animation.repeatCount = HUGE_VALF;     // HUGE_VALF is defined in math.h so import it
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"];
于 2012-05-13T08:18:08.900 に答える