2017-03-30 5 views
0

Wenn unsere App einen Netzwerkverbindungsfehler hat, möchten wir ein farbiges und transparentes Rechteck über dem oberen Bildschirmrand mit etwas "Netzwerk nicht verfügbar" wie Text überlagern. Das Rechteck sollte die gesamte Breite des Bildschirms abdecken und die Höhe sollte ausreichen, um nur den Text anzuzeigen. Wir würden einen Timer verwenden, um das Rechteck nur für eine kurze Zeitspanne zu zeigen. Wie kannst du das tun?Swift: Überlagerung Rechteck mit Text über Ansicht

Die aktuelle Ansicht kann einen UITableViewController, einen UIViewController sein, oder etwas anderes ...

Antwort

2

Sie können dies tun:

let deadlineTime = DispatchTime.now() + .seconds(2) 

let window = UIApplication.shared.keyWindow! 

let rectangleView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 20)) 
rectangleView.backgroundColor = UIColor.red 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 20)) 
label.text = "Network not available" 

rectangleView.addSubview(label) 

window.addSubview(rectangleView) 

DispatchQueue.main.asyncAfter(deadline: deadlineTime) { 
    rectangleView.removeFromSuperview() 
} 
+0

Danke, ich werde es versuchen. –

0

So wie ich Overlays getan habe, ist ein neues UIViewController in ein Storyboard zu ziehen, und ziehen Sie ein UIView in dem. Bei der Gestaltung der Benutzeroberfläche kann es hilfreich sein, die Hintergrundfarbe des UIViewController schwarz zu setzen. Wenn Sie Ihre Elemente innerhalb der UIView ausgelegt haben, ändern Sie die Hintergrundfarbe der UIViewController zu transparent.

Hier ist ein Beispiel eines Profils Overlay:

screenshot of an overlay view controller in a storyboard

In diesem Fall habe ich gemacht tatsächlich die UIViewController Hintergrund eine graue Farbe mit einem Alpha von etwa 50%. Dann, wenn ich präsentiere View-Controller einen Fade-Übergang unter Verwendung es sieht aus wie es über die Spitze erscheint den aktuellen Kontext:

func showOverlay() { 
    // 
    guard let vc = UIStoryboard(name: "MyStoryboard", bundle: nil).instantiateViewController(withIdentifier: "myOverlay") as? UIViewController else { 
     print("failed to get myOverlay from MyStoryboard") 
     return 
    } 

    vc.modalPresentationStyle = .overCurrentContext 
    vc.modalTransitionStyle = .crossDissolve 

    self.present(vc, animated: true, completion: { 
     // after 3 seconds, dismiss the overlay 
     dispatchAfterSeconds(3) { 
      vc.dismiss(animated: true) 
     } 
    }) 
} 

Dieser verwendet eine praktische Funktion, dispatchAfterSeconds:

// execute function after delay using GCD 
func dispatchAfterSeconds(_ seconds: Double, completion: @escaping (() -> Void)) { 
    let triggerTime = Int64(Double(NSEC_PER_SEC) * seconds) 
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(triggerTime)/Double(NSEC_PER_SEC), execute: {() -> Void in 
     completion() 
    }) 
} 

Beachten Sie, dass, wenn ich darüber reden, Ändern der Hintergrundfarbe der UIViewController, was ich eigentlich damit meine, ist die Hintergrundfarbe der Ansicht standardmäßig in einem UIViewController erstellt, die in einem Storyboard erstellt wurde.

+0

Vielen Dank für die Antwort. Aber die Lösung, nach der ich suche, würde nur die Leiste (Rechteck) mit Text oben auf dem Bildschirm anzeigen. Der aktuelle Bildschirm wäre immer noch verwendbar, während der Text angezeigt wird. Dh: Der Text würde über einer Tabelle erscheinen und Sie könnten immer noch die Tabelle scrollen, während der Text dort ist. Instagram verwendet einen ähnlichen Ansatz für ihre Netzwerk-Warnmeldung. Es scheint, dass dieser Ansatz die neue Ansicht vollständig über die vorhandene Ansicht zeigt, wodurch die vorhandene Ansicht nicht verwendbar ist, während die Warnung angezeigt wird. –