UIImage с закругленными углами

Я уже прочитал несколько постов. И почти все предлагают использоватьQuartzCore/QuartzCore.h сlayer.cornerRadius

Я попробовал этот метод и еще несколько методов.

Ну, все работает нормально, когда изображение не двигается.

Но в моем проекте я всегда перемещаю свои изображения. Если я добавлю угловой радиус или тень, движение изображения больше не будет плавным. И это выглядит ужасно!

Вот как я изменяю размер своего изображения:

<code>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);
</code>

Я хотел бы знать хороший способ изменить размер моего изображения, добавить тень, радиус угла и все еще иметь плавное движение моего изображения.

Ответы на вопрос(7)

Решение Вопроса
// 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();

насколько я помню, я использовал это некоторое время назад, чтобы сделать изображение с закругленными углами, чтобы вы могли перемещаться в цели. Но, похоже, он отлично масштабировался ...

 MCKapur12 мая 2012 г., 15:33
Круто ... хорошо проводи время
 iWheelBuy12 мая 2012 г., 15:32
Отличная работа! Округлые + плавные движения! Большое спасибо
 PapillonUK22 авг. 2012 г., 23:56
Вау - я просмотрел все, и это самое простое решение, которое я нашел, и которое до сих пор очень эффективно. Я даже использовал его в изображении UITableViewCell без заикания. Brilliant.
 Mark Amery05 окт. 2013 г., 22:00
@ kleo Вы совершенно правы, и вы предложили изменить на Stackoverflow.com / обзор / предложенные-редактирует / 3073006 не должен был быть отклонен. Я только что реализовал изменение (на самом деле немного по-другому, но оно достигает того же результата). Извините, что вы не получили 2 повторения, которые вы заслужили.
 kleo05 окт. 2013 г., 21:23
@ ArnaudDrizard: вместоUIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0); вы можете использоватьUIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);. Это должно исправить вашу проблему!

попробуйте следующий код после импорта файла #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;

Надеюсь, это поможет тебе ....

о использовать 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, равное увеличенному размеру изображения в два раза (image.size.width * 2).

 hyperspasm01 дек. 2014 г., 04:42
Я думаю, что правильнее использоватьUIGraphicsBeginImageContextWithOptions(original.size, NO, original.scale); нет?
 Rick van der Linde24 февр. 2015 г., 22:26
СПАСИБО Гиперспазм, как я это упустил ...

которые рефакторируют его для работы в своих проектах, это отличный рефакторинг, который, надеюсь, может помочь некоторым новым программистам:

+ (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;
}
 manmal01 окт. 2013 г., 17:59
Я предпочитаю добавить это как метод экземпляра в UIImage, но переписать это было всего за несколько секунд. Благодарность
 devios119 авг. 2014 г., 22:39
Обратите внимание, что использованиеUIImageView на самом деле не является необходимым, поскольку все, что вы делаете с ним, использует его для своих границ. Вы можете легко заменить это наCGRect bounds = CGRectMake(0,0,original.size.width,original.size.height);.
 Charlie Seligman22 янв. 2014 г., 23:12
manmal - вы имеете в виду, что вы создаете подкласс UIImage, а затем имеете метод экземпляра, который превращает себя в круг? Если это так, то мне очень нравится эта идея: -)
 mobilemonkey21 янв. 2014 г., 20:31
Это хорошо, но вы можете избежать углового радиуса и сделать его полностью круглым, используя bezierPathWithOvalInRect.

возможно, это связано с необходимостью рендеринга изображения с угловым радиусом в каждом кадре. Это неизбежно, если за изображением нет сплошного цвета («смешивание» различается в каждом кадре и, следовательно, должно быть рассчитано). Если это не так, и вы можете получить сплошной цвет фона, убедитесь, что вы установилиUIView.backgroundColor к чему-то кроме clearColor, с альфа 1.0. Также может помочь растеризация слоя (он сохранит кэшированную версию визуализированного слоя в памяти и будет использовать ее на протяжении всей анимации. Но, опять же, не поможет, если слой не непрозрачный).

Вот как ты это делаешь:

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

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

Импортируйте заголовок QuartzCore (#import) и поиграйте со свойством layer в UIImageView.

ImageView.layer.cornerRadius = Radius;
ImageView.clipsToBounds = YES;

yourImageView.layer.cornerRadius = yourRadius;                                   

yourImageView.clipsToBounds = YES;                                 

Ваш ответ на вопрос