Przypadkiem, jeśli ktoś usłyszy w wyszukiwarce Google (tak jak ja) i szuka dodania obramowania do UIImageView, poszukaj odpowiedzi na dole @mclin. Działa świetnie!
Mahendra Liya
Odpowiedzi:
241
Z OS> 3.0 możesz to zrobić:
//you need this import#import <QuartzCore/QuartzCore.h>[imageView.layer setBorderColor:[[UIColor blackColor]CGColor]];[imageView.layer setBorderWidth:2.0];
Kiedy dopasowuję się do obrazów w powyższym imageView, obraz jest wyświetlany doskonale, ale boki obrazu pozostają puste, i to samo dzieje się z górną i dolną częścią obrazu, gdy obraz jest poziomy. Puste miejsce wygląda brzydko z ustawioną ramką. Czy napotkałeś ten problem? Jeśli tak, zaproponuj sposób rozwiązania tego problemu
Spotkaj się
@Hamutsi imageView.image = myImage;
Kyle Clegg
6
Tak, możesz. Instancje programu UIImagemożna wciągnąć w kontekst graficzny za pomocą programu CoreGraphics.
Mark Adams
Jak wskazuje @rockstar, może być konieczne dodanie imageView.layer.masksToBounds = YES;
Ten kod spowoduje powstanie różowej ramki wokół obrazu. Jeśli jednak zamierzasz po prostu wyświetlić obramowanie, użyj warstwy UIImageViewi ustaw jej obramowanie.
@ MarcusS.Zarra Zdaję sobie sprawę, że nie istniały, kiedy udzielono odpowiedzi na to pytanie, ale to rozwiązanie nie bierze pod uwagę wyświetlacza Retina. Gdybyś mógł to poprawić, byłbym naprawdę wdzięczny :)
Luke
@lukech Próbka nie musi być poprawiana. Po prostu zwiększ szerokość linii, jeśli korzystasz z urządzenia siatkówkowego.
Marcus S. Zarra
2
sizeTo 320x480, niezależnie od tego, czy jesteś na urządzeniu Retina, więc po zapisaniu obrazu, zapisuje w rozdzielczości 320x480px tego, a nie 640x960.
Świetny hack, zwłaszcza jeśli chodzi o zużycie pamięci - inne odpowiedzi zajmą 2x pamięć, aby na chwilę dodać tę granicę. Porada dla profesjonalistów - jeśli chcesz po prostu dodać obramowanie po jednej stronie, możesz też zmienić granice. Świetna odpowiedź!
judepereira
11
Jeśli znasz wymiary swojego obrazu, to dodanie obramowania do warstwy UIImageView jest najlepszym rozwiązaniem AFAIK. Rzeczywiście, możesz po prostu ustawić ramkę dla swojego imageView na x, y, image.size.width, image.size.height
Jeśli masz ImageView o stałym rozmiarze z dynamicznie ładowanymi obrazami, które są zmieniane (lub skalowane do AspectFit), Twoim celem jest zmiana rozmiaru widoku obrazu na nowy obraz o zmienionym rozmiarze.
Najkrótszy sposób, aby to zrobić:
// 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)];
Ale aby użyć AVMakeRectWithAspectRatioInsideRect, musisz to dodać
#import <AVFoundation/AVFoundation.h>
import do pliku, a także uwzględnij strukturę AVFoundation w swoim projekcie (dostarczana w pakiecie z SDK).
Nie możesz dodać obramowania, ale działałoby to z tym samym efektem. Możesz również utworzyć UIView o nazwie blackBG w tym przykładzie w UIImageView z obrazem obramowania i pustym środkiem, a wtedy miałbyś niestandardowe obramowanie obrazu zamiast tylko czarnego.
Oto, co ostatecznie zrobiłem; zagnieżdżając mój UIImageVieww środku nieco większego UIViewkoloru mojej ramy.
Ben Kreeger
6
wszystkie te odpowiedzi działają dobrze, ALE dodaj prostokąt do obrazu. Załóżmy, że masz kształt (w moim przypadku motyl) i chcesz dodać obramowanie (czerwoną ramkę):
potrzebujemy dwóch kroków: 1) weź obraz, przekonwertuj go na CGImage, przejdź do funkcji rysującej poza ekranem w kontekście za pomocą CoreGraphics i oddaj nowy CGImage
-(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];
}
Dodałem zwykłego motyla i większego motyla z czerwoną obwódką.
Możesz manipulować samym obrazem, ale znacznie lepszym sposobem jest po prostu dodanie UIView, który zawiera UIImageView, i zmiana tła na czarne. Następnie ustaw rozmiar tego widoku kontenera na nieco większy niż UIImageView.
Czy będzie działać z różnymi rozmiarami obrazów, które zmieniają się w locie? UIImageView będzie się zmieniać przez cały czas, a UIView? ps Manipulowanie samym obrazem będzie świetne.
Shay
Będziesz musiał dostosować ramkę widoku zawierającego wraz z obrazem - możesz zapisać środkowe właściwości dla obu widoków, dostosować rozmiar obrazu, dostosować rozmiar kontenera, a następnie ponownie ustawić właściwości środkowe dla obu.
Kendall Helmstetter Gelner
Dokładnie tak to zrobiłem, w przeciwieństwie do wytyczania ścieżki za pomocą CG. po prostu wydawało się łatwiejsze.
Corey Floyd
2
Innym sposobem jest zrobienie tego bezpośrednio od projektanta.
Wybierz swój obraz i przejdź do „Pokaż inspektora tożsamości”.
Tutaj możesz ręcznie dodać „ Atrybuty środowiska wykonawczego zdefiniowane przez użytkownika” :
Stworzyłem klasę, która dodaje obramowanie do imageView h. Użyj tej klasy zamiast UIImageView. Podałem dopełnienie 4. Możesz podać według własnego uznania.
Odpowiedzi:
Z OS> 3.0 możesz to zrobić:
źródło
UIImage
można wciągnąć w kontekst graficzny za pomocą programu CoreGraphics.Możesz to zrobić, tworząc nowy obraz (również w Twoim innym poście na to pytanie):
Ten kod spowoduje powstanie różowej ramki wokół obrazu. Jeśli jednak zamierzasz po prostu wyświetlić obramowanie, użyj warstwy
UIImageView
i ustaw jej obramowanie.źródło
CGContextSetLineWidth
size
To 320x480, niezależnie od tego, czy jesteś na urządzeniu Retina, więc po zapisaniu obrazu, zapisuje w rozdzielczości 320x480px tego, a nie 640x960.Ten kod może służyć do dodawania
UIImageView
obramowania widoku.źródło
źródło
Jeśli znasz wymiary swojego obrazu, to dodanie obramowania do warstwy UIImageView jest najlepszym rozwiązaniem AFAIK. Rzeczywiście, możesz po prostu ustawić ramkę dla swojego imageView na x, y, image.size.width, image.size.height
Jeśli masz ImageView o stałym rozmiarze z dynamicznie ładowanymi obrazami, które są zmieniane (lub skalowane do AspectFit), Twoim celem jest zmiana rozmiaru widoku obrazu na nowy obraz o zmienionym rozmiarze.
Najkrótszy sposób, aby to zrobić:
Ale aby użyć AVMakeRectWithAspectRatioInsideRect, musisz to dodać
import do pliku, a także uwzględnij strukturę AVFoundation w swoim projekcie (dostarczana w pakiecie z SDK).
źródło
Nie możesz dodać obramowania, ale działałoby to z tym samym efektem. Możesz również utworzyć UIView o nazwie blackBG w tym przykładzie w UIImageView z obrazem obramowania i pustym środkiem, a wtedy miałbyś niestandardowe obramowanie obrazu zamiast tylko czarnego.
źródło
UIImageView
w środku nieco większegoUIView
koloru mojej ramy.wszystkie te odpowiedzi działają dobrze, ALE dodaj prostokąt do obrazu. Załóżmy, że masz kształt (w moim przypadku motyl) i chcesz dodać obramowanie (czerwoną ramkę):
potrzebujemy dwóch kroków: 1) weź obraz, przekonwertuj go na CGImage, przejdź do funkcji rysującej poza ekranem w kontekście za pomocą CoreGraphics i oddaj nowy CGImage
2) przekonwertuj na uiimage z powrotem i narysuj:
}
}
Dodałem zwykłego motyla i większego motyla z czerwoną obwódką.
źródło
Możesz dodać obramowanie do UIImageView, a następnie zmienić rozmiar UIimageView zgodnie z rozmiarem obrazu:
Upewnij się, że ustawiłeś początek imageView na środek
źródło
Możesz manipulować samym obrazem, ale znacznie lepszym sposobem jest po prostu dodanie UIView, który zawiera UIImageView, i zmiana tła na czarne. Następnie ustaw rozmiar tego widoku kontenera na nieco większy niż UIImageView.
źródło
Innym sposobem jest zrobienie tego bezpośrednio od projektanta.
Wybierz swój obraz i przejdź do „Pokaż inspektora tożsamości”.
Tutaj możesz ręcznie dodać „ Atrybuty środowiska wykonawczego zdefiniowane przez użytkownika” :
źródło
// musisz zaimportować
a następnie dla ImageView w obramowaniu
źródło
Ta funkcja zwróci obraz z czarną ramką. Spróbuj tego ... mam nadzieję, że to ci pomoże
źródło
W Swift 3 oto jak to zrobić z samym UIImage:
źródło
Dla tych, którzy szukają rozwiązania typu plug-and-play na UIImage, napisałem odpowiedź CodyMace jako rozszerzenie.
Stosowanie:
let outlined = UIImage(named: "something")?.outline()
źródło
Stworzyłem klasę, która dodaje obramowanie do imageView h. Użyj tej klasy zamiast UIImageView. Podałem dopełnienie 4. Możesz podać według własnego uznania.
źródło
Używam tej metody, aby dodać obramowanie poza obrazem . Możesz dostosować
boderWidth
stałą szerokość obramowania .Szybki 3
źródło