UIImage с закругленными углами
Я уже прочитал несколько сообщений. И почти все предлагают использовать QuartzCore/QuartzCore.h
с layer.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);
Я хотел бы знать хороший способ изменить размер моего изображения, добавить тень, угол радиуса и по-прежнему иметь плавное перемещение моего изображения.
Ответы
Ответ 1
// 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();
Попробуйте перейти с помощью этого кода, насколько я помню, я использовал это некоторое время назад, что делает изображение с закругленными углами, которое вы можете перемещать в цели. Но, похоже, он отлично масштабируется...
Ответ 2
Ответ Рохана - отличный. Если у кого-то есть какие-либо проблемы с рефакторингом, чтобы работать в своих проектах, здесь есть аккуратный рефактор, который, надеюсь, поможет некоторым более новым программистам:
+ (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;
}
Ответ 3
Существует более оптимизированная версия памяти решения 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;
}
Вы можете получить круглое изображение, указав angleRadius равный увеличенный размер изображения дважды (image.size.width * 2).
Ответ 4
попробуйте следующий код после импорта файла #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;
Надеюсь, это поможет вам....
Ответ 5
Если производительность при анимации позиции изображения плоха, это, вероятно, потому, что она должна отображать изображение с радиусом угла в каждом кадре. Это неизбежно, если за изображением нет сплошного цвета ( "смешение" в каждом кадре различается и, следовательно, должно быть рассчитано). Если это не так, и вы можете получить фон сплошного цвета, убедитесь, что вы установили UIView.backgroundColor
в нечто иное, чем clearColor, с альфа 1.0.
Также может помочь растрирование слоя (он сохранит кэшированную версию выделенного слоя в памяти и будет использовать ее во всей анимации, но опять же, не поможет, если слой не непрозрачен).
Вот как вы это делаете:
UIView *yourView;
CALayer *yourLayer = yourView.layer;
yourLayer.shouldRasterize = YES;
yourLayer.rasterizationScale = [UIScreen mainScreen].scale;
Ответ 6
Установите закругленные углы на изображении в Objective-C:
yourImageView.layer.cornerRadius = yourRadius;
yourImageView.clipsToBounds = YES;
Ответ 7
Да, это возможно.
Импортируйте заголовок QuartzCore (#import) и играйте со свойством layer UIImageView.
ImageView.layer.cornerRadius = Radius;
ImageView.clipsToBounds = YES;