21

私はすでにいくつかの投稿を読みました。そして、ほとんどの人QuartzCore/QuartzCore.hlayer.cornerRadius

私はこの方法と他のいくつかの方法を試しました。

ええと、画像が動かないときはすべてうまくいきます。

しかし、私のプロジェクトでは、常に画像を移動します。角の半径や影を追加すると、画像の動きがスムーズでなくなります。そして、それは素晴らしく見えます!

これが画像のサイズを変更する方法です。

CGSize newSize = CGSizeMake(200*height/image.size.height, 280);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(nil, newSize.width, newSize.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
CGContextClearRect(context, CGRectMake(0, 0, newSize.width, newSize.height));
CGContextDrawImage(context, CGRectMake(0, 0, newSize.width, newSize.height), image.CGImage);
CGImageRef scaledImage = CGBitmapContextCreateImage(context);
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
UIImage *newImage = [UIImage imageWithCGImage: scaledImage];
CGImageRelease(scaledImage);

画像のサイズを変更したり、影や角の半径を追加したりしながら、画像をスムーズに動かすための良い方法を知りたいです。

4

7 に答える 7

71
// Get your image somehow
UIImage *image = [UIImage imageNamed:@"image.jpg"];

// Begin a new image that will be the new image with the rounded corners 
// (here with the size of an UIImageView)
 UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);

 // Add a clip before drawing anything, in the shape of an rounded rect
  [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds 
                        cornerRadius:10.0] addClip];
 // Draw your image
[image drawInRect:imageView.bounds];

 // Get the image, here setting the UIImageView image
  imageView.image = UIGraphicsGetImageFromCurrentImageContext();

 // Lets forget about that we were drawing
  UIGraphicsEndImageContext();

このコードで移動してみてください。覚えている限り、これをしばらく前に使用して、ターゲットに移動できる角の丸い画像を作成しました。しかし、それはうまくスケーリングされたように見えました...

于 2012-05-12T13:09:11.093 に答える
13

ローハンの答えは素晴らしいものです。プロジェクトで機能するようにリファクタリングすることに問題がある場合は、ここにあるきちんとしたリファクタリングが、新しいプログラマーの助けになることを願っています。

+ (UIImage *)imageWithRoundedCornersSize:(float)cornerRadius usingImage:(UIImage *)original
{    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:original];

    // Begin a new image that will be the new image with the rounded corners
    // (here with the size of an UIImageView)
    UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);

    // Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds
                            cornerRadius:cornerRadius] addClip];
    // Draw your image
    [original drawInRect:imageView.bounds];

    // Get the image, here setting the UIImageView image
    imageView.image = UIGraphicsGetImageFromCurrentImageContext();

    // Lets forget about that we were drawing
    UIGraphicsEndImageContext();

    return imageView.image;
}
于 2013-04-07T11:01:28.377 に答える
10

Charlie Seligman のソリューションには、より最適化されたメモリ バージョンがあります。この目的で UIImageView を使用する必要はありません。

+ (UIImage *)imageWithRoundedCornersSize:(float)cornerRadius usingImage:(UIImage *)original
{
    CGRect frame = CGRectMake(0, 0, original.size.width, original.size.height);

    // Begin a new image that will be the new image with the rounded corners
    // (here with the size of an UIImageView)
    UIGraphicsBeginImageContextWithOptions(original.size, NO, original.scale);

    // Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:frame
                                cornerRadius:cornerRadius] addClip];
    // Draw your image
    [original drawInRect:frame];

    // Get the image, here setting the UIImageView image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    // Lets forget about that we were drawing
    UIGraphicsEndImageContext();

    return image;
}

画像サイズを 2 回 (image.size.width * 2) 大きくするように cornerRadius を指定すると、丸い画像を取得できます。

于 2014-04-10T18:22:34.933 に答える
2

ファイル #import を .m ファイルにインポートした後、次のコードを試してください。

  yourImageView.layer.shadowColor=[[UIColor grayColor] CGColor];
  yourImageView.layer.cornerRadius = 8;
  yourImageView.layer.shadowOffset=CGSizeMake(2, 2);
  yourImageView.layer.shadowOpacity=1.0;
  yourImageView.layer.shadowRadius=1.0;

願っています、これはあなたを助けます....

于 2012-05-12T13:53:55.700 に答える
1

画像の位置をアニメーション化するときにパフォーマンスが悪い場合は、おそらくフレームごとに角の半径で画像をレンダリングする必要があるためです。画像の背後に無地の色がない場合、これは避けられません (「ブレンド」はフレームごとに異なるため、計算する必要があります)。これが当てはまらず、背景を単色にすることができる場合はUIView.backgroundColor、アルファ 1.0 で clearColor 以外に設定してください。また、レイヤーをラスタライズすると役立つ場合があります(レンダリングされたレイヤーのキャッシュされたバージョンをメモリに保存し、アニメーション全体で使用します。ただし、レイヤーが不透明でない場合は役に立ちません)。

これを行う方法は次のとおりです。

UIView *yourView;
CALayer *yourLayer = yourView.layer;

yourLayer.shouldRasterize = YES;
yourLayer.rasterizationScale = [UIScreen mainScreen].scale;
于 2012-05-13T06:34:42.427 に答える
1

Objective-C で画像の角を丸く設定します。

yourImageView.layer.cornerRadius = yourRadius;                                   

yourImageView.clipsToBounds = YES;                                 
于 2016-02-09T06:34:26.107 に答える