web-dev-qa-db-ja.com

角が丸いUIImage

私はすでにいくつかの投稿を読みました。そして、ほとんどすべての人が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);

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

20
iWheelBuy
// 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();

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

70
MCKapur

ローハンの答えは素晴らしいものです。誰かがプロジェクトで機能するようにそれをリファクタリングしている場合は、新しいプログラマーに役立つと思われるきちんとしたリファクタリングです:

+ (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;
}
12

チャーリーセリグマンのソリューションのより最適化されたメモリバージョンがあります。このために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;
}

CornerRadiusを2倍に増やした画像サイズ(image.size.width * 2)に指定すると、丸い画像を取得できます。

10
alexmorhun

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

  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;

これがあなたを助けることを願っています...

2
Paras Joshi

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

これはあなたがこれを行う方法です:

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

yourLayer.shouldRasterize = YES;
yourLayer.rasterizationScale = [UIScreen mainScreen].scale;
1
Javier Soto

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

yourImageView.layer.cornerRadius = yourRadius;                                   

yourImageView.clipsToBounds = YES;                                 
1
Kiran Bhoraniya

はい、可能です。

QuartzCore(#import)ヘッダーをインポートし、UIImageViewのレイヤープロパティを操作します。

ImageView.layer.cornerRadius = Radius;
ImageView.clipsToBounds = YES;
1
Dixit Patel