Mit UIKit ist es einfach, eine gestrichelte Linie zu zeichnen. So:
CGFloat dashes[] = {4, 2};
[path setLineDash:dashes count:2 phase:0];
[path stroke];
Gibt es eine Möglichkeit, eine echte gepunktete Linie zu zeichnen?
Irgendwelche Ideen?
Da diese Frage wirklich alt ist und niemand eine vollständige @IBDesignable
Lösung gefunden hat, ist sie hier ...
Hoffe, es erspart jemandem das Tippen.
@IBDesignable class DottedVertical: UIView {
@IBInspectable var dotColor: UIColor = UIColor.etc
@IBInspectable var lowerHalfOnly: Bool = false
override func draw(_ rect: CGRect) {
// say you want 8 dots, with perfect fenceposting:
let totalCount = 8 + 8 - 1
let fullHeight = bounds.size.height
let width = bounds.size.width
let itemLength = fullHeight / CGFloat(totalCount)
let path = UIBezierPath()
let beginFromTop = CGFloat(0.0)
let top = CGPoint(x: width/2, y: beginFromTop)
let bottom = CGPoint(x: width/2, y: fullHeight)
path.move(to: top)
path.addLine(to: bottom)
path.lineWidth = width
let dashes: [CGFloat] = [itemLength, itemLength]
path.setLineDash(dashes, count: dashes.count, phase: 0)
// for ROUNDED dots, simply change to....
//let dashes: [CGFloat] = [0.0, itemLength * 2.0]
//path.lineCapStyle = CGLineCap.round
dotColor.setStroke()
path.stroke()
}
}
Ich habe es vertikal gemacht, du kannst es leicht ändern.
Fügen Sie einfach eine UIView in die Szene ein. Machen Sie es wie Sie möchten, und das ist die Breite der gepunkteten Linie.
Ändern DottedVertical
Sie einfach die Klasse in und Sie sind fertig. Es wird so richtig im Storyboard gerendert.
Beachten Sie, dass der für die Höhe der Blöcke angegebene Beispielcode ("totalCount" usw.) dazu führt, dass die Blöcke perfekt zum Pixel passen und mit den Enden der UIView übereinstimmen, die die Linie erstellt.
Stellen Sie sicher, dass Sie RobMayoffs Antwort unten ankreuzen, die die beiden erforderlichen Codezeilen für Punkte-nicht-Blöcke enthält.
Antworten:
Stellen Sie den Linienkappenstil auf rund und die Ein-Länge auf eine winzige Zahl ein.
Beispiel für einen schnellen Spielplatz:
Ergebnis:
Fügen Sie für Ziel-C unter Verwendung derselben Beispielklasse wie in der Frage einfach hinzu
vor dem Aufruf von
CGContextStrokePath
und ändern Sie diera
Array-Werte so, dass sie meinem Swift-Code entsprechen.quelle
0.01
einen kreisförmigen Punkt ergibt, während sie bei Verwendung leicht verlängert sind0
.Objective-C-Version des obigen Swift-Beispiels:
quelle
Bei Verwendung einer UIView-Erweiterung, die mit Swift 3.0 kompatibel ist, sollte Folgendes funktionieren:
Führen Sie dann in einer Funktion, die danach ausgeführt
viewDidLoad
wirdviewDidLayoutSubviews
, dieaddDashedBorder
Funktion in der betreffenden Ansicht aus:quelle
Ich arbeite ein wenig an der von Rob Mayoff akzeptierten Lösung, um die gepunktete Linie einfach anzupassen:
Die Funktion gibt ein UIImage zurück:
Und so erhalten Sie das Bild:
quelle
Hallo Leute, diese Lösung hat bei mir gut funktioniert. Ich habe irgendwo gefunden und ein bisschen geändert, um Konsolenwarnungen zu verhindern.
Das ist das Ergebnis:
quelle
Keine vollständige Antwort, nur ein sehr wichtiger Punkt , den James P in einem Kommentar zur Lieblingsantwort angesprochen hat:
Er schrieb:
Beispielsweise,
quelle
In Swift 3.1 können Sie den folgenden Code verwenden:
Haben Sie drei Stile:
quelle
Funktioniert gut mit dem folgenden Code,
quelle
Hey, es ist vielleicht zu spät, um diese Frage zu beantworten. Aber wenn Sie zustimmen, möchte ich den Entwicklern, die möglicherweise in Zukunft mit diesem Problem konfrontiert werden, einen einfachen Weg zur Lösung dieses Problems vorstellen. Ich denke also, dass die einfachste Lösung mit @IBDesignable. Sie müssen nur diese Klasse erstellen
Und hängen Sie es dann so an Ihre Ansicht im Storyboard an
Sobald Sie fertig sind,
let dashes: [CGFloat] = [0.0, itemLength * 1.1]
passen Sie den Abstand zwischen den Ebenen dieser Zeile -> Zeile 39 in der DottedVertical-Klasse kalt an. Wenn Sie die Breite der Ebene anpassen möchten, müssen Sie nur die Breite der Linienansicht in Ihrem Storyboard bearbeitenquelle
Ich habe den folgenden Code implementiert, um einen Rand mit gepunktetem Stil am unteren Rand von
titleLabel
(UILabel
) in hinzuzufügenviewDidAppear
:Aktualisierung: https://gist.github.com/kaiix/4070967
quelle