Zu einem UIScrollView *toScrollView
(das ist die Breite des Bildschirms) möchte ich einen grauen unteren Rand hinzufügen (genau wie das des -Felds der Erstellungsansicht der nativen Nachrichten-App des iPhones).
Um dies zu erreichen, folgte ich Cocoa Touch: Wie ändere ich die Randfarbe und -stärke von UIView? und bedeckte gerade die obere Grenze mit dem Brauch UINavigationBar
und machte dastoScrollView
x-Koordinate -1 & Breite 322 der ', so dass der linke & rechte Rand gerade außerhalb des Bildschirms sind.
Das sieht gut aus, ist aber eine Art Hack, und ich habe mich gefragt, ob es einen besseren Weg gibt, dies zu tun.
- (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
}
Antworten:
Anstatt a zu verwenden
UIView
, wie @ ImreKelényi vorschlägt, können Sie Folgendes verwendenCALayer
:quelle
QuartzCore framework
Ihrem Projekt auch etwas hinzufügen , wenn Sie es nicht haben, da möglicherweise Compilerfehler auftreten.QuartzCore.framework
mehr hinzufügen .43.0f
,toScrollView.frame.size.height
um sicherzustellen, dass es unten istHier ist eine allgemeinere Swift-Erweiterung zum Erstellen eines Rahmens für jede
UIView
Unterklasse:Swift 3
quelle
border.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width)
usw.Implementiert in einer Kategorie wie folgt:
UIButton + Border.h:
UIButton + Border.m:
quelle
Swift 4
Wenn Sie eine wirklich anpassungsfähige Lösung benötigen (für alle Bildschirmgrößen), dann ist dies:
quelle
Sie können eine separate
UIView
Farbe mit 1 Punkt Höhe und grauer Hintergrundfarbe hinzufügenself.view
und direkt darunter positionierentoScrollView
.quelle
Lösung für Swift 4
HintergrundFarbe lightGray. Ändern Sie bei Bedarf die Farbe.
quelle
Es gibt auch verbesserten Code mit Funktionen zum Entfernen von Rahmen. Basierend auf einer konformen Antwort .
Update: Swift 3
quelle
func remove(border: ViewBorder) { layer.sublayers? .compactMap { $0 } .filter { $0.name == border.rawValue } .forEach { $0.removeFromSuperlayer() } }
Das Problem bei diesen Erweiterungsmethoden besteht darin, dass Sie beim späteren Anpassen der Größe von UIView / UIButton keine Chance haben, die Größe des CALayer an die neue Größe anzupassen. Was Sie mit einer verlegten Grenze verlassen wird. Ich fand es besser, meinen UIButton zu unterordnen, Sie könnten natürlich auch andere UIViews unterordnen. Hier ist ein Code:
quelle
Oder der leistungsfreundlichste Weg ist, drawRect einfach so zu überladen:
quelle
drawRect:
ist nicht unbedingt leistungsfreundlich. Ich bin mir ziemlich sicher, dass die Verwendung einer Ebene eine viel bessere Leistung bietet.setFrame:
,setBounds:
oderlayoutSubviews
Methoden.layoutSublayersOfLayer:
anstelle vonsetFrame:
oder einem der anderen empfehlenSwift 3-Version von Confiles Antwort:
Verwendung bei Verwendung des automatischen Layouts:
quelle
Wenn Sie Einschränkungen verwenden (und daher nicht über die Rahmengrößen verfügen), können Sie eine Rahmenansicht mit den erforderlichen Einschränkungen hinzufügen
Stellen Sie es dann wie folgt ein
(inspiriert von dieser Antwort )
quelle
Schnell
Erstellen Sie eine UIView-Erweiterung
Ziel c
Erstellen Sie eine Kategorieklasse von UIView
UIView + Border.h
UIView + Border.m
Verwendung :- Wählen Sie ein beliebiges Steuerelement aus dem Storyboard aus und zeigen Sie den Attributinspektor an (rechte Seite). Das folgende Bild zeigt ein Beispiel. (Hinweis: Der Rand wird nur zur Laufzeit angezeigt.)
Jetzt können Sie eine beliebige Seite der Rahmenfarbe und -breite festlegen.
quelle
Ich habe eine allgemeine Methode geschrieben, mit der an jeder gewünschten Seite ein Rand eingefügt wird
UIView
. Sie können Dicke, Farbe, Ränder undzOrder
für jede Seite definieren.quelle
Sie müssen nicht für jeden Rand eine Ebene hinzufügen. Verwenden Sie einfach einen Bezier-Pfad, um sie einmal zu zeichnen.
quelle
Swift 4/3
Sie können diese Lösung unten verwenden. Es funktioniert mit UIBezierPaths, die leichter als Ebenen sind und schnelle Startzeiten verursachen. Es ist einfach zu bedienen, siehe Anweisungen unten.
quelle
Swift 4
Basierend auf: https://stackoverflow.com/a/32821607/9980800
UIView + Border
}}
Verwendung:-
quelle
Swift 4
Basierend auf https://stackoverflow.com/a/32513578/5391914
quelle
Die vollständigste Antwort. https://github.com/oney/UIView-Border
quelle
Swift 4-Erweiterung mit Randbreite und Farbe. Funktioniert super!
}}
quelle
Swift 5.1. Verwenden Sie mit zwei Erweiterungen die Methode return CALayer, damit Sie sie erneut zum Aktualisieren von Frames verwenden können.
quelle
Erweiterung UIView {
func addBottomLine (Farbe: UIColor, Höhe: CGFloat) {
}}
}}
quelle