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.
}
}
wo ist das automatische Layout? –
Ich verwende in diesem Beispiel kein automatisches Layout, es ist handgeschriebener Code – David
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