Как я могу взять UIImage и дать ему черную рамку? - PullRequest
122 голосов
/ 31 августа 2009

Как я могу установить границу UIImage?

Ответы [ 16 ]

240 голосов
/ 11 июня 2010

С ОС> 3.0 вы можете сделать это:

//you need this import
#import <QuartzCore/QuartzCore.h>

[imageView.layer setBorderColor: [[UIColor blackColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];
67 голосов
/ 31 августа 2009

Вы можете сделать это, создав новое изображение (также ответив в другой публикации этого вопроса):

- (UIImage*)imageWithBorderFromImage:(UIImage*)source;
{
  CGSize size = [source size];
  UIGraphicsBeginImageContext(size);
  CGRect rect = CGRectMake(0, 0, size.width, size.height);
  [source drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0];

  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetRGBStrokeColor(context, 1.0, 0.5, 1.0, 1.0); 
  CGContextStrokeRect(context, rect);
  UIImage *testImg =  UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return testImg;
}  

Этот код создаст розовую рамку вокруг изображения. Однако, если вы собираетесь просто отобразить границу, используйте слой UIImageView и установите его границу.

38 голосов
/ 22 марта 2012
#import <QuartzCore/CALayer.h>


UIImageView *imageView = [UIImageView alloc]init];
imageView.layer.masksToBounds = YES;
imageView.layer.borderColor = [UIColor blackColor].CGColor;
imageView.layer.borderWidth = 1;    

Этот код можно использовать для добавления UIImageView границы просмотра.

11 голосов
/ 24 февраля 2015
imageView_ProfileImage.layer.cornerRadius =10.0f;
imageView_ProfileImage.layer.borderColor = [[UIColor blackColor] CGColor];
imageView_ProfileImage.layer.borderWidth =.4f;
imageView_ProfileImage.layer.masksToBounds = YES;
11 голосов
/ 12 января 2013

Если вы знаете размеры вашего изображения, то добавление границы к слою UIImageView - лучшее решение AFAIK. Фактически, вы можете просто установить в свой imageView значение x, y, image.size.width, image.size.height

Если у вас есть ImageView фиксированного размера с динамически загружаемыми изображениями, размер которых изменяется (или масштабируется до AspectFit), то ваша цель - изменить размер изображения до нового измененного изображения.

Самый короткий способ сделать это:

// containerView is my UIImageView
containerView.layer.borderWidth = 7;
containerView.layer.borderColor = [UIColor colorWithRed:0.22 green:0.22 blue:0.22 alpha:1.0].CGColor;

// this is the key command
[containerView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, containerView.frame)];

Но чтобы использовать AVMakeRectWithAspectRatioInsideRect, необходимо добавить это

#import <AVFoundation/AVFoundation.h>

оператор импорта в ваш файл, а также включение структуры AVFoundation в ваш проект (поставляется в комплекте с SDK).

8 голосов
/ 31 августа 2009

Нельзя добавить границу, но это сработает для того же эффекта. Вы также можете превратить UIView с именем blackBG в этом примере в UIImageView с изображением границы и пустым средним, и тогда у вас будет собственная граница изображения вместо просто черного.

UIView *blackBG = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)];

blackBG.backgroundColor = [UIColor blackColor];

UIImageView *myPicture = [[UIImageView alloc] initWithImage:
                          [UIImage imageNamed: @"myPicture.jpg"]];

int borderWidth = 10;

myPicture.frame = CGRectMake(borderWidth,
                             borderWidth,
                             blackBG.frame.size.width-borderWidth*2,
                             blackBG.frame.size.height-borderWidth*2)];

[blackBG addSubview: myPicture];
6 голосов
/ 08 апреля 2012

все эти ответы работают нормально, НО добавить прямоугольник к изображению. Предположим, у вас есть фигура (в моем случае бабочка), и вы хотите добавить рамку (красную рамку):

нам нужно два шага: 1) взять изображение, преобразовать его в CGImage, перейти к функции рисования вне экрана в контексте с использованием CoreGraphics и вернуть новый CGImage

2) преобразовать в uiimage назад и нарисовать:

// remember to release object!
+ (CGImageRef)createResizedCGImage:(CGImageRef)image toWidth:(int)width
andHeight:(int)height
{
// create context, keeping original image properties
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width,
                                             height,
                                             8
                                             4 * width,
                                             colorspace,
                                             kCGImageAlphaPremultipliedFirst
                                             );

 CGColorSpaceRelease(colorspace);

if(context == NULL)
    return nil;

// draw image to context (resizing it)
CGContextSetInterpolationQuality(context, kCGInterpolationDefault);

CGSize offset = CGSizeMake(2,2);
CGFloat blur = 4;   
CGColorRef color = [UIColor redColor].CGColor;
CGContextSetShadowWithColor ( context, offset, blur, color);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
// extract resulting image from context
CGImageRef imgRef = CGBitmapContextCreateImage(context);
CGContextRelease(context);
return imgRef;

}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

CGRect frame = CGRectMake(0,0,160, 122);
UIImage * img = [UIImage imageNamed:@"butterfly"]; // take low res OR high res, but frame should be the low-res one.
imgV = [[UIImageView alloc]initWithFrame:frame];
[imgV setImage: img];
imgV.center = self.view.center;
[self.view addSubview: imgV];

frame.size.width = frame.size.width * 1.3;
frame.size.height = frame.size.height* 1.3;
CGImageRef cgImage =[ViewController createResizedCGImage:[img CGImage] toWidth:frame.size.width andHeight: frame.size.height ];

imgV2 = [[UIImageView alloc]initWithFrame:frame];
[imgV2 setImage: [UIImage imageWithCGImage:cgImage] ];

// release:
if (cgImage) CGImageRelease(cgImage);

[self.view addSubview: imgV2];

}

Я добавил нормальную бабочку и большую бабочку с красной каймой.

5 голосов
/ 22 июня 2011

Вы можете добавить границу к UIImageView, а затем изменить размер UIimageView в соответствии с размером изображения:

#import <QuartzCore/QuartzCore.h>


// adding border to the imageView
[imageView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];

// resize the imageView to fit the image size
CGSize size = [image size];
float factor = size.width / self.frame.size.width;
if (factor < size.height / self.frame.size.height) {
    factor = size.height / self.frame.size.height;
}

CGRect rect = CGRectMake(0, 0, size.width/factor, size.height/factor);
imageView.frame = rect;

Убедитесь, что вы установили источник изображения в центре

2 голосов
/ 15 января 2015

Другой способ сделать это напрямую от дизайнера.

Выберите изображение и перейдите в раздел «Показать инспектор удостоверений».

Здесь вы можете вручную добавить « Определенные пользователем атрибуты времени выполнения» :

layer.borderColor
layer.borderWidth


enter image description here

2 голосов
/ 31 августа 2009

Вы можете манипулировать самим изображением, но гораздо лучше просто добавить UIView, который содержит UIImageView, и изменить фон на черный. Затем установите размер этого контейнера немного больше, чем UIImageView.

...