Nachdem das iPhone 6s und das iPhone 6s Plus mit Bildschirmen auf den Markt gekommen waren, die die
3D Touch- Technologie unterstützen, erschien fast sofort eine App zum Wiegen von Pflaumen und Pfirsichen im App Store.

Ich kann nicht mit Sicherheit sagen, warum genau diese Früchte, aber ich kann definitiv sagen, warum genau Früchte. Tatsache ist, dass der iPhone-Bildschirmsensor nach dem Prinzip der Bestimmung des Stromverlusts von der Sensoroberfläche arbeitet. Für diesen Verlust benötigen Sie einen aktiven Finger oder etwas, das eine elektrische Kapazität hat. Ich denke, jeder weiß, dass die Bildschirme von i-Geräten nicht mit einem Plastikstift oder -nagel funktionieren. Deshalb war es unmöglich, bei dieser Anwendung etwas Metallisches zu wiegen. Aber die Früchte haben eine elektrische Kapazität, der Sensor wird auf sie ausgelöst und der
3D Touch funktioniert direkt normal.
Sehr schnell wurde diese Anwendung aus dem App Store entfernt. Persönlich scheint es mir, dass dies aufgrund der engstirnigen Benutzer geschehen ist, die versucht haben, Pfundgewichte auf ihren Geräten zu wiegen. Natürlich fielen die Geräte aus und sie wurden zu Service-Centern gebracht. Und dort sagten sie etwas aus der Serie: "Die Anwendung wurde aus dem offiziellen Store heruntergeladen und sie haben dort nicht gewarnt, dass es unmöglich ist ...".
Infolgedessen gibt es keine derartigen Anwendungen im Geschäft, aber niemand wird uns daran hindern, sie für uns selbst zu erstellen.
Herausforderung
Wir müssen eine Anwendung schreiben, die aus einem Controller besteht, auf dem sich eine einladende Inschrift, ein gezeichneter Kreis in der Mitte des Bildschirms, Gewichtsindikatoren in Gramm und Prozent der ermittelten Kraft befinden (weiter im Text wird dies klarer). Wenn Sie auf den Bildschirm klicken, wird am Berührungspunkt ein Kreis angezeigt, der je nach Druck zunimmt oder abnimmt. Es muss sofort gesagt werden, dass auf einem Simulator eine solche Anwendung nicht getestet werden kann. Daher müssen Sie die Anwendung auf einem realen Gerät ausführen. Am Ende sollten Sie eine solche Bewerbung erhalten:

Projekterstellung
Öffnen Sie Xcode und wählen Sie Neues Projekt erstellen,
Single View-Anwendungsvorlage
Erstellen einer Schnittstelle in Xcode
Gehen Sie zum
Storyboard , ziehen Sie mehrere
UILabels aus der Elementbibliothek auf den Controller und platzieren Sie sie näher an den oberen oder unteren Rändern des Controllers. Es stellte sich so heraus:

Aus ästhetischen Gründen werden wir den Ort hervorheben, an dem wir Objekte in einen roten Kreis setzen. Sie können ein fertiges Bild mit einem Kreis aufnehmen, dies ist jedoch nicht unsere Methode)). Wir werden die Kreise mit den Methoden von
Core Graphics zeichnen. Es ist bequemer, eine Vererbungsklasse aus UIView zu erstellen und bereits damit zu arbeiten.
Fügen Sie dem Projekt eine neue Datei hinzu und nennen Sie sie
ScaleView . Erstellen
Sie in dieser Datei eine
ScaleView- Klasse, die von
UIView erbt.

import UIKit class ScaleView: UIView { override func draw(_ rect: CGRect) { } }
Gehen Sie als Nächstes zum
StoryBoard , übertragen Sie es aus der Bibliothek der
UIView- Elemente auf den Controller und platzieren Sie es in der Mitte unseres Controllers. Wählen Sie die neu hinzugefügte
UIView im
Identity Inspektor die Klasse
Zeichnungsbereich, die wir zuvor erstellt haben .

Mithilfe von Konstanten können Sie auch die Regeln für die relative Anordnung von Elementen auf dem Bildschirm festlegen. Für mich sieht es so aus:

Kreise zeichnen
Wechseln Sie zur Datei
ScaleView.swift . In der
ScaleView- Klasse
haben wir die Methode
draw (_ rect :) erstellt , mit der wir im Anzeigebereich dieser
UIView zeichnen .
Fügen Sie der Methode
draw (_ rect :) den folgenden Code hinzu
override func draw(_ rect: CGRect) { let context = UIGraphicsGetCurrentContext()
- Wir erhalten den grafischen Kontext, in dem wir zeichnen werden
- Wir legen die Farbe fest, mit der wir zeichnen. In diesem Fall. Ist rot
- Stellen Sie die Breite der Linie ein, mit der wir zeichnen werden.
- Wir legen den Pfad für das Zeichnen in Form eines Bogens fest, dessen Mittelpunkt sich in der Mitte der ScaleView befindet, mit einem Radius, der der halben Breite der ScaleView minus 14 entspricht (dies dient zum Einpassen des Bogens in die sichtbare Ansicht), und einem langen Bogen - 360 Grad um den gesamten Umfang. Bitte beachten Sie, dass meine Breitenziffern im vorherigen Absatz mit Konstanten fest codiert wurden.
- Wir zeichnen auf den gegebenen Pfad mit den gegebenen Parametern
Sie können es zur Überprüfung kompilieren, aber Sie können auch eine Anweisung festlegen, um Änderungen direkt im
Interface Builder anzuzeigen.
Die ganze Magie in der
@IBDesignable- Direktive.
Markieren Sie die
ScaleView- Klasse mit dieser Anweisung
. import UIKit @IBDesignable class ScaleView: UIView { override func draw(_ rect: CGRect) { let context = UIGraphicsGetCurrentContext() context?.setStrokeColor(UIColor.red.cgColor) context?.setLineWidth(14.0) context?.addArc(center: CGPoint(x: 375 / 2, y: 375 / 2), radius: 375 / 2 - 14, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true) context?.strokePath() } }
Gehen Sie danach zum
StoryBoard , warten Sie etwas und Sie sehen einen roten Kreis in der Mitte des
ViewControllers
Lassen Sie uns üben und einen weiteren Kreis zeichnen, der kleiner und dünner ist.
Fügen Sie dazu der Methode
draw (_ rect :) in der
ScaleView- Datei den folgenden Code
hinzu :
context?.setLineWidth(1.0) context?.setStrokeColor(UIColor.lightGray.cgColor) context?.addArc(center: CGPoint(x: 375 / 2, y: 375 / 2), radius: 375 / 4 - 14, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true) context?.strokePath()
Ich denke, es ist klar, und so haben wir hinzugefügt. Tatsächlich haben wir einen weiteren Kreis hinzugefügt, grau, Radien ein Viertel der Breite der
ScaleView und eine Breite von einem Punkt.
Ergebnisse
Storyboard:
Der letzte Teil unserer Vorbereitungsarbeiten wird die Erstellung von Verkaufsstellen für
ScaleView und zwei
UILabels sein , die die Stärke des
Druckens des Bildschirms in Prozent und das Gewicht in Gramm zeigen.
Wenn Sie bei
gedrückter Strg-Taste Elemente aus dem
ViewController ziehen, werden die erforderlichen Ausgänge erstellt.
@IBOutlet weak var scaleView: ScaleView! @IBOutlet weak var forceLabel: UILabel! @IBOutlet weak var grammLabel: UILabel!
Direkt - skaliert
Wir näherten uns also dem Moment der Messung der Druckkraft auf den Bildschirm. Gehen Sie zu
ViewController und
fügen Sie in der
viewDidLoad () -Methode Startwerte für alle
UILabel hinzu override func viewDidLoad() { super.viewDidLoad() forceLabel.text = "0% force" grammLabel.text = "0 " }
Wie alle Prozesse, die mit Bildschirmabgriffen verbunden sind, können sie im Controller in der Methode
touchMoved (_: :) abgefangen werden. Diese Methode funktioniert, wenn sich der Bildschirm rechtzeitig berührt. Das heißt, Wenn sich der Finger auf dem Bildschirm befindet oder sich darauf bewegt, funktioniert diese Methode und Sie können alle Berührungen und ihre Eigenschaften verfolgen. Fügen Sie es dem
ViewController hinzu und schreiben Sie den folgenden Code:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { // 1 if #available(iOS 9.0, *) { // 2 if traitCollection.forceTouchCapability == UIForceTouchCapability.available { // 3 if touch.force >= touch.maximumPossibleForce { // 4 forceLabel.text = "100%+ force" grammLabel.text = "385 " } else { let force = (touch.force / touch.maximumPossibleForce) * 100 // 5 let grams = force * 385 / 100 // 6 let roundGrams = Int(grams) // 7 forceLabel.text = "\(Int(force))% force" // 8 grammLabel.text = "\(roundGrams) " } } } } }
Die gesamte Mechanik der
Libra iOS-Anwendung ist diese Methode. Alles andere, was wir in dieser Lektion weiter tun werden, sind Verbesserungen. Wir haben bereits alle grundlegenden Arbeiten erledigt. Nehmen wir es auseinander
- Aus den gesamten Berührungen des Bildschirms wählen wir die erste aus
- Diese Anweisung überprüft das auf dem Gerät installierte Betriebssystem und überspringt nur dann weiter, wenn die Betriebssystemversion 9.0 oder höher ist. Die Arbeit mit 3D Touch wurde erst mit der 9. Version von iOS möglich. Der Versuch, mit den Schmerzen früherer Versionen umzugehen, macht keinen Sinn
- In dieser Zeile wird das Gerät auf Unterstützung für den Bildschirm mit der 3D-Touch- Funktion getestet. Immerhin kann iOS Version 10 auch auf dem iPhone 6 stehen, aber auf diesem Bildschirm erkennt der Bildschirm dieses Smartphones nicht die Druckkraft. Diese Inspektion muss unter strengen Apple-Anforderungen durchgeführt werden.
- Eine Berührung hat eine Krafteigenschaft, in der die Kraft jedes Mal übertragen wird, wenn die Methode touchMoved (_: :) funktioniert. Und in dieser Zeile vergleichen wir den Wert der aktuellen Presskraft und den maximal möglichen Wert der Presskraft. Und wenn die Druckkraft größer ist als das Maximum ist , dann geben wir unsere UILabel Maximalwerte - nämlich 100% Leistung und 385 Gramm. Es sollte beachtet werden, warum es 385 Gramm ist. Tatsache ist, dass die 3D-Touch- Technologie so hergestellt ist, dass 100% der Presskraft 385 Gramm entspricht. Dementsprechend erhalten Sie einen Prozentsatz der Presskraft, wir können das Gewicht leicht in Gramm berechnen.
- Hier machen wir diese Berechnungen. In dieser Zeile berechnen wir den prozentualen Druck
- Hier berechnen wir das Gewicht in Gramm, basierend auf der Formel 100% = 385 Gramm
- Dies ist eine einfache Rundung von Gramm auf das Ganze
- Wir geben die prozentuale Stärke und das Gewicht in Gramm an unser UILabel weiter
Bevor Sie die Anwendung starten und überprüfen, müssen Sie eine weitere Methode hinzufügen, die funktioniert, wenn alle Berührungen auf dem Bildschirm
touchEnded (: :) stoppen, um die Anfangsposition unserer
UILabels festzulegen und die Werte 0% und 0 Gramm zu übergeben. Fügen Sie diese Methode der
ViewController- Klasse hinzu.
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { forceLabel.text = "0% force" grammLabel.text = "0 " }
Jetzt können Sie die Anwendung kompilieren und überprüfen. Natürlich müssen Sie dies auf einem realen Gerät tun, um das Ergebnis zu sehen. Der Simulator kann keine erzwungenen Klicks auf dem Bildschirm emulieren.

Verbesserungen
Die Hauptfunktionalität ist fertig, aber als ich diese Anwendung schrieb, habe ich beschlossen, drei Dinge hinzuzufügen:
- Wenn der Maximalwert erreicht ist, soll die Vibrationsreaktion funktionieren
- Das Aktualisieren von Werten in UILabel erfolgt sehr schnell (ich glaube, Sie haben dies beim Testen bemerkt), sodass Sie etwas Glätte hinzufügen müssen.
- Am Druckpunkt sollte ein halbtransparenter Kreis erscheinen. Sein Durchmesser sollte mit zunehmendem Druck zunehmen und mit abnehmendem Druck abnehmen
Wir werden uns im
folgenden Artikel mit diesen Ergänzungen befassen :-)