Do a UIScrollView *toScrollView
(która jest szerokością ekranu) chcę dodać szare dolne obramowanie (dokładnie takie, jak w polu to widoku tworzenia wiadomości w natywnej aplikacji Wiadomości na telefonie iPhone).
Aby to osiągnąć, podążyłem za Cocoa Touch: Jak zmienić kolor i grubość obramowania UIView? i właśnie zakryłem górną granicę niestandardową UINavigationBar
i utworzyłem toScrollView
współrzędną x -1 i szerokość 322 tak, aby lewa i prawa krawędź były tuż poza ekranem.
Wygląda dobrze, ale to swego rodzaju hack i zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego.
- (void)viewDidLoad {
[super viewDidLoad];
// Add UINavigationBar *navigationBar at top.
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self action:@selector(cancelAction)];
UINavigationBar *navigationBar = [[UINavigationBar alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)];
navigationBar.items = [NSArray arrayWithObject:self.navigationItem];
// Add UIScrollView *toScrollView below navigationBar.
UIScrollView *toScrollView = [[UIScrollView alloc]
initWithFrame:CGRectMake(-1.0f, 43.0f, 322.0f, 45.0f)];
toScrollView.backgroundColor = [UIColor whiteColor];
toScrollView.layer.borderColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor;
toScrollView.layer.borderWidth = 1.0f;
[self.view addSubview:toScrollView];
[self.view addSubview:navigationBar]; // covers top of toScrollView
}
Odpowiedzi:
Zamiast używać a
UIView
, jak sugeruje @ ImreKelényi, możesz użyćCALayer
:źródło
QuartzCore framework
do projektu, jeśli go nie masz, ponieważ mogą wystąpić błędy kompilatora.QuartzCore.framework
już dodawać .43.0f
siętoScrollView.frame.size.height
na, aby upewnić się, że jest na doleOto bardziej uogólnione rozszerzenie Swift do tworzenia obramowania dla dowolnej
UIView
podklasy:Szybki 3
źródło
border.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width)
itp.Zaimplementowane w kategorii jak poniżej:
UIButton + Border.h:
UIButton + Border. M:
źródło
Szybki 4
Jeśli potrzebujesz naprawdę adaptacyjnego rozwiązania (dla wszystkich rozmiarów ekranu), to jest to:
źródło
Możesz dodać oddzielny element
UIView
o wysokości 1 punktu i szarym kolorem tłaself.view
i umieścić go poniżejtoScrollView
.źródło
Rozwiązanie dla Swift 4
BackgroundColor jasnoszary. Zmień kolor, jeśli potrzebujesz.
źródło
Jest też ulepszony kod z funkcją usuwania obramowania. Na podstawie konfrontowanej odpowiedzi .
Aktualizacja: Swift 3
źródło
func remove(border: ViewBorder) { layer.sublayers? .compactMap { $0 } .filter { $0.name == border.rawValue } .forEach { $0.removeFromSuperlayer() } }
Problem z tymi metodami rozszerzeń polega na tym, że gdy UIView / UIButton później dostosuje swój rozmiar, nie ma możliwości zmiany rozmiaru CALayer, aby pasował do nowego rozmiaru. Który pozostawi cię z niewłaściwą granicą. Okazało się, że lepiej jest podklasować mój UIButton, możesz oczywiście podklasować również inne UIViews. Oto kod:
źródło
Lub najbardziej przyjaznym dla wydajności sposobem jest przeciążenie drawRect, po prostu w ten sposób:
źródło
drawRect:
niekoniecznie jest przyjazne dla wydajności. Jestem prawie pewien, że użycie warstwy ma znacznie lepszą wydajność.setFrame:
,setBounds:
lublayoutSubviews
.layoutSublayersOfLayer:
zamiastsetFrame:
lub którykolwiek z pozostałychWersja Swift 3 odpowiedzi Confile:
Zastosowanie podczas korzystania z układu automatycznego:
źródło
Jeśli używasz ograniczeń (a więc nie masz rozmiarów ramek), możesz dodać widok obramowania z wymaganymi ograniczeniami
Następnie ustaw coś takiego jak poniżej
(zainspirowany tą odpowiedzią )
źródło
Szybki
Utwórz rozszerzenie UIView
Cel C
Utwórz klasę kategorii UIView
UIView + Border.h
UIView + Border. M
Sposób użycia: - Wybierz dowolną kontrolkę z serii ujęć, a następnie pokaż inspektora atrybutów (prawa strona) Zobaczysz poniższy obraz Przykład. (Uwaga: obramowanie pojawia się tylko w czasie wykonywania).
Teraz możesz ustawić kolor i szerokość obramowania dowolnej strony.
źródło
Napisałem ogólną metodę, która doda obramowanie po dowolnych stronach, które chcesz
UIView
. Możesz zdefiniować grubość, kolor, marginesy izOrder
dla każdej strony.źródło
Nie musisz dodawać warstwy dla każdej ramki, po prostu użyj ścieżki beziera, aby je narysować raz.
źródło
Swift 4/3
Możesz skorzystać z tego rozwiązania poniżej. Działa na ścieżkach UIBezierPath, które są lżejsze niż warstwy, powodując szybki czas uruchamiania. Jest łatwy w użyciu, zobacz instrukcje poniżej.
źródło
Szybki 4
Na podstawie: https://stackoverflow.com/a/32821607/9980800
UIView + obramowanie
}
Stosowanie:-
źródło
Szybki 4
Na podstawie https://stackoverflow.com/a/32513578/5391914
źródło
Najbardziej kompletna odpowiedź. https://github.com/oney/UIView-Border
źródło
Szybkie rozszerzenie 4 z szerokością i kolorem obramowania. Działa świetnie!
}
źródło
Swift 5.1. Używaj z dwoma rozszerzeniami, metoda return CALayer, aby ponownie użyć jej do aktualizacji ramek.
źródło
rozszerzenie UIView {
func addBottomLine (color: UIColor, height: CGFloat) {
}
}
źródło