Как добиться рамки вокруг изображения - PullRequest
1 голос
/ 30 ноября 2010

Мне нравится, как это приложение (http://shakeitphoto.com/) ставит рамку вокруг изображения .. Я хотел бы сделать что-то подобное в своем приложении, но не уверен, как мне это сделать.

Любые идеио том, как с помощью UIImage я могу обернуть вокруг него рамку?

1 Ответ

2 голосов
/ 01 декабря 2010

С этого сайта, кажется, вы хотите границу с тенью. Есть 2 разумных варианта, 3, если тебя не волнует тень.

Если вас не волнует тень, вы можете просто сделать что-то вроде

#import <QuartzCore/QuartzCore.h> // this should be at the top

// inside your view layout code
myImageView.layer.borderColor = [UIColor whiteColor].CGColor
myImageView.layer.borderWidth = 5;

Это даст вам 5-пиксельную белую рамку, вставленную в вид, наслоенную поверх содержимого вида (например, изображение). То, что вам не дадут, это тень. Если вы хотите тень, есть 2 других варианта.

Вы можете просто создать изображение, которое включает в себя границу и тень, и ничего больше. Просто сделайте все остальное альфа-прозрачным. Затем вы можете просто наложить это изображение поверх того, которое вы хотите отобразить (либо с двумя изображениями, либо создав третье изображение из двух). Это должно работать нормально, но не будет масштабироваться до разных размеров изображения. В случае связанного приложения размер изображения всегда одинаков, поэтому они могут использовать это.

Другой вариант - просто нарисовать границу и тень поверх вашего изображения на новом изображении. Вот небольшой пример кода, который сделает это - он создает новое изображение того же размера, что и ваш оригинал, но с белой затененной рамкой:

- (UIImage *)borderedImage:(UIImage *)image {
    // the following NO means the new image has an alpha channel
    // If you know the source image is fully-opaque, you may want to set that to YES
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
    [image drawAtPoint:CGPointZero];
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    const CGFloat shadowRadius = 5;
    CGContextSetShadowWithColor(ctx, 0, shadowRadius, [UIColor blackColor].CGColor);
    [[UIColor whiteColor] set];
    CGRect rect = (CGRect){CGPointZero, image.size};
    const CGFloat frameWidth = 5;
    rect = CGRectInset(rect, frameWidth / 2.0f, frameWidth / 2.0f);
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:rect];
    path.lineWidth = frameWidth;
    [path stroke];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    // note: getting the new image this way throws away the orientation data from the original
    // You could create a third image by doing something like
    //   newImage = [UIImage imageWithCGImage:newImage.CGImage scale:newImage.scale orientation:image.orientation]
    // but I am unsure as to how orientation actually affects rendering (if at all)
    UIGraphicsEndImageContext();
    return newImage;
}

(примечание: этот код не был скомпилирован и может содержать ошибки)

...