Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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;