2017-06-13 3 views
0

Ich benutze Swift 3, um eine iOS-Schnittstelle zu erstellen, wo einige UIView s, die (unter anderem) UILabel enthalten, je nachdem, wo sie auf dem Bildschirm positioniert sind, nach oben und unten skaliert werden. Meine erste Herangehensweise war das Erstellen und Befüllen der Ansichten in einer komfortablen Größe (sagen wir 100x100) und dann skalieren sie wie benötigt mit CGAffineTransform(scaleX:y:), aber ich habe festgestellt, dass das Downscaling des Textes in den Etiketten überhaupt nicht anmutig ist, und Der Text wird verpixelt und in kleinen Maßstäben fast unlesbar. Als Vergleich (siehe Beispiel unten) liefert die Änderung der Schriftgröße direkt viel bessere Ergebnisse, allerdings ist die Struktur in meinen Ansichten etwas komplex und es müsste mühsam sein, alles neu zu zeichnen, basierend auf einem gewissen Größenfaktor. Gibt es einen besseren und reibungsloseren Weg, dieses Problem anzugehen?Qualität der herunterskalierten UILabels

Hier ist ein Beispielprojekt, das ich erstellt habe, um das Problem zu veranschaulichen, sowie die Ausgabe im Simulator (wie auf dem iPhone selbst), herunterskalierte Ansichten sind auf der linken Seite (rot) und geänderte Schriftgrößen sind richtig (Grün).

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     for i in 1...10 { 
      let f = CGFloat(1.0)/CGFloat(i) 
      let view1 = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 50)) 
      view1.backgroundColor = UIColor.red 
      let label1 = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 50)) 
      label1.text = "\(100/i)%" 
      label1.font = UIFont(name: "Verdana", size: 24.0) 
      label1.textAlignment = .right 
      view1.addSubview(label1) 
      view1.transform = CGAffineTransform(scaleX: f, y: f) 
      view1.center = CGPoint(x: 160 - 75.0 * f, y: CGFloat(60 * i) + 25.0 * f) 
      self.view.addSubview(view1) 

      let view2 = UIView(frame: CGRect(x: CGFloat(170), y: CGFloat(60 * i), width: 150 * f, height: 50 * f)) 
      view2.backgroundColor = UIColor.green 
      let label2 = UILabel(frame: CGRect(x: 0, y: 0, width: 150 * f, height: 50 * f)) 
      label2.text = "\(100/i)%" 
      label2.font = UIFont(name: "Verdana", size: 24.0 * f) 
      view2.addSubview(label2) 
      self.view.addSubview(view2) 

     } 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

downscaling the view vs. changing the font size

+0

wo ist das automatische Layout? –

+0

Ich verwende in diesem Beispiel kein automatisches Layout, es ist handgeschriebener Code – David

+0

Müssen Sie die Bounding-Box auf eine bestimmte Größe skalieren? Oder die Schriftart? Können Sie '.adjustsFontSizeToFitWidth = true' verwenden und die Schrift automatisch skalieren lassen? – DonMag

Antwort

1

Diese könnte eine Antwort - aber nicht wirklich geeignet für einen Kommentar, so ...

dieses zu versuchen - es schafft eine dritte „Säule“ der gelben - Hintergrundansichten, mit .adjustsFontSizeToFitWidth. Die Schriftgröße wird basierend auf der Größe der Ansichten, die die Beschriftungen enthalten, automatisch angepasst.

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    for i in 1...10 { 
     let f = CGFloat(1.0)/CGFloat(i) 
     let view1 = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 50)) 
     view1.backgroundColor = UIColor.red 
     let label1 = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 50)) 
     label1.text = "\(100/i)%" 
     label1.font = UIFont(name: "Verdana", size: 24.0) 
     label1.textAlignment = .right 
     view1.addSubview(label1) 
     view1.transform = CGAffineTransform(scaleX: f, y: f) 
     view1.center = CGPoint(x: 160 - 75.0 * f, y: CGFloat(60 * i) + 25.0 * f) 
     self.view.addSubview(view1) 

     let view2 = UIView(frame: CGRect(x: CGFloat(170), y: CGFloat(60 * i), width: 150 * f, height: 50 * f)) 
     view2.backgroundColor = UIColor.green 
     let label2 = UILabel(frame: CGRect(x: 0, y: 0, width: 150 * f, height: 50 * f)) 
     label2.text = "\(100/i)%" 
     label2.font = UIFont(name: "Verdana", size: 24.0 * f) 
     view2.addSubview(label2) 
     self.view.addSubview(view2) 

     let view3 = UIView(frame: CGRect(x: CGFloat(270), y: CGFloat(60 * i), width: 150 * f, height: 50 * f)) 
     view3.backgroundColor = UIColor.yellow 
     let label3 = UILabel(frame: view3.bounds) 
     label3.text = "\(100/i)%" 
     label3.font = UIFont(name: "Verdana", size: 24.0) 
     label3.adjustsFontSizeToFitWidth = true 
     label3.minimumScaleFactor = 0.05 
     label3.numberOfLines = 0 
     // we want the label to resize with the view, if the view frame changes 
     label3.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
     view3.autoresizesSubviews = true 
     view3.addSubview(label3) 
     self.view.addSubview(view3) 

    } 
} 
+0

Das ist definitiv eine Verbesserung, danke! Die einzige kleine Sache ist, dass sich das Verhältnis zwischen der Größe des Textes und der Größe des äußeren Rahmens ändert, weil die Größe des Textes durch die Grenzen des Rahmens beschränkt ist, es wird nicht tatsächlich "skaliert". Ich denke, ich muss nur meine 'UILabel's in eng anliegende' UIView's einschließen, um diese Technik zu verwenden. In meiner App habe ich mehrere Stücke Text, die alle zusammen in Bezug auf die Größe der Außenansicht skalieren müssen, ich brauche einige Zwischenschichten – David

+0

Ich war in der Lage, fast genau das ursprüngliche Ergebnis zu reproduzieren, während die hohe Qualität und Ich ändere nicht die Schriftgröße von Hand, indem ich diese Technik benutze und die 'UILabel' in eine 'UIView'-Zwischenform einfügte, deren Höhe ich dann anpassen musste (Schriftgröße * 1,25), um den Raum um den Text zu berücksichtigen. Es mag einen besseren/einfacheren Weg geben, aber zumindest funktioniert dieser und sieht gut aus. – David

+0

@David - Es gibt (fast) immer mehr als eine Art, Dinge zu tun ... froh, dass du die gewünschten Ergebnisse hast. – DonMag