Widziałem u inspektora, że mogę zmienić kolor tła, ale chciałbym również zmienić kolor i grubość ramki, czy to możliwe?
275
Widziałem u inspektora, że mogę zmienić kolor tła, ale chciałbym również zmienić kolor i grubość ramki, czy to możliwe?
Odpowiedzi:
Aby ustawić właściwość obramowania, musisz użyć warstwy widoku. na przykład:
Aby uzyskać dostęp do tej funkcji, musisz także połączyć się z QuartzCore.framework.
źródło
__bridge CGColorRef
. To nie działa. Musi być[UIColor blackColor].CGColor
tak, jak wspomniano w odpowiedzi.#import <QuartzCore/QuartzCore.h>
nie jest już potrzebny.Aktualizacja Xcode 6
Od najnowszej wersji Xcode istnieje lepsze rozwiązanie tego problemu:
Z
@IBInspectable
można ustawić atrybuty bezpośrednio od wewnątrzAttributes Inspector
.To ustawia
User Defined Runtime Attributes
dla ciebie:Istnieją dwa podejścia do skonfigurowania tego:
Opcja 1 (z aktualizacją na żywo w Storyboard)
MyCustomView
.UIView
.@IBDesignable
(powoduje to, że aktualizacja Wyświetl na żywo). *@IBInspectable
MyCustomView
`
*
@IBDesignable
działa tylko, gdy jest ustawiony na początkuclass MyCustomView
Opcja 2 (nie działa od Swift 1.2, patrz komentarze)
Rozszerz swoją klasę UIView:
W ten sposób domyślny widok zawsze zawiera te dodatkowe pola edytowalne
Attributes Inspector
. Kolejną zaletą jest to, że nie musisz zaMycustomView
każdym razem zmieniać klasy . Wadą tego jest jednak to, że zmiany będą widoczne dopiero po uruchomieniu aplikacji.źródło
Możesz także utworzyć obramowanie z kolorem swojego życzenia.
* r, g, b są wartościami od 0 do 255.
źródło
r
,g
ib
powinny prawdopodobnie pływaków; z dzielnikami powinny być również pływaki:r / 255.0
.Dodaj następujące @IBInspectables w rozszerzeniu UIView
A potem powinieneś być w stanie ustawić atrybuty borderColor i borderWidth bezpośrednio z Inspektora atrybutów. Zobacz załączony obraz
Inspektor atrybutów
źródło
Kiedy korzystam z rozwiązania CALayer Vladimira, a na wierzchu mam animację, taką jak modalne odrzucanie UINavigationController, widzę wiele błędów i problemy z wydajnością rysowania.
Tak więc innym sposobem na osiągnięcie tego, ale bez błędów i utraty wydajności, jest utworzenie niestandardowego UIView i zaimplementowanie
drawRect
komunikatu w następujący sposób:źródło
setNeedsDisplay
widok. Wymusi to przerysowanie UIView i pośrednio nastąpi ponowne wywołaniedrawRect
. Nie testowane, choć ...źródło
Wypróbuj ten kod:
źródło
Nie sugerowałbym przesłonięcia metody drawRect z powodu spowodowania spadku wydajności.
Zamiast tego zmodyfikowałbym właściwości klasy jak poniżej (w niestandardowym uiview):
Nie widziałem żadnych błędów przy powyższym podejściu - nie jestem pewien, dlaczego włożenie initWithFrame zatrzymuje je ;-)
źródło
Chciałem dodać to do odpowiedzi @ marczking ( Opcja 1 ) jako komentarz, ale mój niski status na StackOverflow temu zapobiega.
Zrobiłem port odpowiedzi @ marczking na Cel C. Działa jak urok, dzięki @marczking!
UIView + Border.h:
UIView + Border.m:
źródło
@IBInspectable działa dla mnie na iOS 9, Swift 2.0
źródło
Jeśli nie chcesz edytować warstwy UIView, zawsze możesz osadzić widok w innym widoku. Widok nadrzędny miałby kolor tła ustawiony na kolor obramowania. Byłby również nieco większy, w zależności od tego, jak szeroka ma być granica.
Oczywiście działa to tylko wtedy, gdy twój widok nie jest przezroczysty i potrzebujesz tylko jednego koloru obramowania. OP chciał samej granicy w samym widoku, ale może to być realna alternatywa.
źródło
Jeśli chcesz dodać inną ramkę z różnych stron, możesz dodać widok podrzędny z konkretnym stylem, jest to sposób łatwy do wymyślenia.
źródło
kolor obramowania przedmiotu w szybkim 4.2:
źródło