Antworten:
Mit OS> 3.0 können Sie dies tun:
//you need this import
#import <QuartzCore/QuartzCore.h>
[imageView.layer setBorderColor: [[UIColor blackColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];
UIImage
können mit CoreGraphics in einen Grafikkontext gezogen werden.
Sie können dies tun, indem Sie ein neues Bild erstellen (auch in Ihrem anderen Beitrag zu dieser Frage beantwortet):
- (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;
}
Dieser Code erzeugt einen rosa Rand um das Bild. Wenn Sie jedoch nur den Rand anzeigen möchten, verwenden Sie die Ebene von UIImageView
und legen Sie den Rand fest.
CGContextSetLineWidth
size
ist 320x480, unabhängig davon, ob Sie sich auf einem Retina-Gerät befinden oder nicht. Wenn Sie das Bild speichern, wird es mit dieser Auflösung von 320x480px und nicht mit 640x960 gespeichert.
#import <QuartzCore/CALayer.h>
UIImageView *imageView = [UIImageView alloc]init];
imageView.layer.masksToBounds = YES;
imageView.layer.borderColor = [UIColor blackColor].CGColor;
imageView.layer.borderWidth = 1;
Dieser Code kann zum Hinzufügen eines UIImageView
Ansichtsrahmens verwendet werden.
imageView_ProfileImage.layer.cornerRadius =10.0f;
imageView_ProfileImage.layer.borderColor = [[UIColor blackColor] CGColor];
imageView_ProfileImage.layer.borderWidth =.4f;
imageView_ProfileImage.layer.masksToBounds = YES;
Wenn Sie die Abmessungen Ihres Bildes kennen, ist das Hinzufügen eines Rahmens zur Ebene von UIImageView die beste Lösung für AFAIK. Tatsächlich können Sie Ihre Bildansicht einfach auf x, y, image.size.width, image.size.height setzen
Wenn Sie eine Bildansicht mit fester Größe und dynamisch geladenen Bildern haben, deren Größe geändert (oder auf AspectFit skaliert) wird, besteht Ihr Ziel darin, die Bildansicht auf das neue Bild mit geänderter Größe zu ändern.
Der kürzeste Weg dazu:
// 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)];
Um AVMakeRectWithAspectRatioInsideRect zu verwenden, müssen Sie dies hinzufügen
#import <AVFoundation/AVFoundation.h>
Importieren Sie die Anweisung in Ihre Datei und fügen Sie auch das AVFoundation-Framework in Ihr Projekt ein (im Lieferumfang des SDK enthalten).
Sie können keinen Rahmen hinzufügen, dies würde jedoch für denselben Effekt funktionieren. Sie können die UIView mit dem Namen blackBG in diesem Beispiel auch in eine UIImageView mit einem Rahmenbild und einer leeren Mitte verwandeln. Dann hätten Sie einen benutzerdefinierten Bildrahmen anstelle von nur Schwarz.
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];
UIImageView
in der Mitte einer etwas größeren UIView
meiner Rahmenfarbe.
Alle diese Antworten funktionieren gut, ABER fügen Sie einem Bild ein Rechteck hinzu. Angenommen, Sie haben eine Form (in meinem Fall einen Schmetterling) und möchten einen Rand (einen roten Rand) hinzufügen:
Wir brauchen zwei Schritte: 1) Nehmen Sie das Bild, konvertieren Sie es in CGImage, übergeben Sie es an eine Funktion, um mit CoreGraphics außerhalb des Bildschirms in einem Kontext zu zeichnen, und geben Sie ein neues CGImage zurück
2) konvertiere zu uiimage zurück und zeichne:
// 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];
}}
Ich fügte einen normalen Schmetterling und einen rot umrandeten größeren Schmetterling hinzu.
Sie können der UIImageView einen Rahmen hinzufügen und dann die Größe der UIimageView entsprechend der Bildgröße ändern:
#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;
Stellen Sie sicher, dass Sie den Ursprung der Bildansicht auf die Mitte setzen
Sie können das Bild selbst bearbeiten. Eine viel bessere Möglichkeit besteht darin, einfach eine UIView hinzuzufügen, die die UIImageView enthält, und den Hintergrund in Schwarz zu ändern. Stellen Sie dann die Größe dieser Containeransicht etwas größer als die UIImageView ein.
Eine andere Möglichkeit ist, direkt vom Designer zu tun.
Wählen Sie Ihr Bild aus und gehen Sie unter "Identitätsinspektor anzeigen".
Hier können Sie manuell " Benutzerdefinierte Laufzeitattribute" hinzufügen :
layer.borderColor
layer.borderWidth
Diese Funktion gibt Ihnen ein Bild mit schwarzem Rand zurück. Versuchen Sie dies. Ich hoffe, dies wird Ihnen helfen
- (UIImage *)addBorderToImage:(UIImage *)image frameImage:(UIImage *)blackBorderImage
{
CGSize size = CGSizeMake(image.size.width,image.size.height);
UIGraphicsBeginImageContext(size);
CGPoint thumbPoint = CGPointMake(0,0);
[image drawAtPoint:thumbPoint];
UIGraphicsBeginImageContext(size);
CGImageRef imgRef = blackBorderImage.CGImage;
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, size.width,size.height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGPoint starredPoint = CGPointMake(0, 0);
[imageCopy drawAtPoint:starredPoint];
UIImage *imageC = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageC;
}
In Swift 3 machen Sie Folgendes mit dem UIImage selbst:
let size = CGSize(width: image.size.width, height: image.size.height)
UIGraphicsBeginImageContext(size)
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
image?.draw(in: rect, blendMode: .normal, alpha: 1.0)
let context = UIGraphicsGetCurrentContext()
context?.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1)
context?.stroke(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.imageView.image = newImage
Für diejenigen, die nach einer Plug-and-Play-Lösung für UIImage suchen, habe ich die Antwort von CodyMace als Erweiterung geschrieben.
Verwendung: let outlined = UIImage(named: "something")?.outline()
extension UIImage {
func outline() -> UIImage? {
let size = CGSize(width: self.size.width, height: self.size.height)
UIGraphicsBeginImageContext(size)
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
self.draw(in: rect, blendMode: .normal, alpha: 1.0)
let context = UIGraphicsGetCurrentContext()
context?.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1)
context?.stroke(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
}
Ich habe eine Klasse erstellt, die imageView h einen Rahmen hinzufügt. Verwenden Sie diese Klasse anstelle von UIImageView. Ich habe eine Auffüllung von 4 angegeben. Sie können nach Ihren Wünschen angeben.
class UIBorderImageView: UIView {
private lazy var imageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFit
imageView.translatesAutoresizingMaskIntoConstraints = false
return imageView
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.White()
self.layer.borderColor = UIColor.GreyMedium().cgColor
self.layer.borderWidth = 1.0
self.layer.cornerRadius = 4.0
self.layer.masksToBounds = true
self.setUpViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUpViews(){
self.addSubview(imageView)
self.addConstraintsWithFormat(format: "H:|-4-[v0]-4-|", views: imageView)
self.addConstraintsWithFormat(format: "V:|-4-[v0]-4-|", views: imageView)
}
func configureImageViewWith(image:UIImage){
self.imageview.image = image
}}
Ich benutze diese Methode, um einen Rand außerhalb des Bildes hinzuzufügen . Sie können die Rahmenbreite boderWidth
konstant anpassen .
func addBorderToImage(image : UIImage) -> UIImage {
let bgImage = image.cgImage
let initialWidth = (bgImage?.width)!
let initialHeight = (bgImage?.height)!
let borderWidth = Int(Double(initialWidth) * 0.10);
let width = initialWidth + borderWidth * 2
let height = initialHeight + borderWidth * 2
let data = malloc(width * height * 4)
let context = CGContext(data: data,
width: width,
height: height,
bitsPerComponent: 8,
bytesPerRow: width * 4,
space: (bgImage?.colorSpace)!,
bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue);
context?.draw(bgImage!, in: CGRect(x: CGFloat(borderWidth), y: CGFloat(borderWidth), width: CGFloat(initialWidth), height: CGFloat(initialHeight)))
context?.setStrokeColor(UIColor.white.cgColor)
context?.setLineWidth(CGFloat(borderWidth))
context?.move(to: CGPoint(x: 0, y: 0))
context?.addLine(to: CGPoint(x: 0, y: height))
context?.addLine(to: CGPoint(x: width, y: height))
context?.addLine(to: CGPoint(x: width, y: 0))
context?.addLine(to: CGPoint(x: 0, y: 0))
context?.strokePath()
let cgImage = context?.makeImage()
let uiImage = UIImage(cgImage: cgImage!)
free(data)
return uiImage;
}