2017-06-13 5 views
0

スウィフト3を使用して、UIView(とりわけ)を含むものが、スクリーン上のどこに配置されているかに基づいて拡大縮小されています。私の最初のアプローチは、ビューを作成して、寛大に大きなサイズ(100x100)で作成し、必要に応じてCGAffineTransform(scaleX:y:)を使用してスケールすることでしたが、ラベル内のテキストの縮小はまったく効果的ではないことに気付きました。テキストはピクセル化され、小さなスケールでは判読不能に近くなります。比較として(下記の例を参照)、フォントサイズを直接変更するとより良い結果が得られますが、ビュー内の構造はやや複雑で、サイズファクタに基づいてすべてを再描画する必要がありません。この問題にアプローチするためのより良い、よりスムーズな方法がありますか?スケールダウンされたUILabelsの品質

問題を説明するために作成したプロジェクトの例と、シミュレータの出力(iPhone自体と同じ)、縮小されたビューが左側(赤色)、変更されたフォントサイズが右側(緑)。

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

ここで、自動レイアウトはありますか。 –

+0

私はこの例では自動レイアウトを使用していません、それは手書きのコードだけです – David

+0

バウンディングボックスを特定のサイズに拡大縮小する必要がありますか?またはフォントですか? '.adjustsFontSizeToFitWidth = true'を使用してフォントを自動スケールできるようにしますか? – DonMag

答えて

1

この答えかもしれない - これを試してみてくださいが、コメントのために本当に適していないので...

- それは、黄色の3番目の「列」を作成しますバックグラウンドビューは、.adjustsFontSizeToFitWidthを使用しています。フォントサイズは、ラベルを含むビューのサイズに基づいて自動的に調整されます。

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

これは間違いなく改善です、ありがとう!唯一の小さなことは、テキストのサイズがフレームの境界によって制約されるため、テキストのサイズと外部フレームのサイズの比が変化することです。実際には「拡大縮小」しません。だから私はちょうど私の 'UILabel'をそのテクニックを使用するために厳密に適合する' UIView'で囲まなければなりません。私のアプリでは、外側のビューのサイズに関して一緒に拡大縮小する必要のあるテキストがいくつかありますが、いくつかの中間層が必要です – David

+0

高画質を維持しながら元の結果をほぼ正確に再現できました。このテクニックを使用し、中間の 'UIView'に' UILabel'を囲むことで、フォントサイズを手作業で変更することはありませんでした。テキストの周りのスペースを考慮して高さを調整する必要がありました(フォントサイズ* 1.25)。それを行うためのより良い/より簡単な方法があるかもしれませんが、少なくともこの1つはうまく動作しています。 – David

+0

@David - (ほとんど)常に複数の方法を実行しています...あなたが望む結果が得られたらうれしいです。 – DonMag

関連する問題