2015-01-02 7 views
8

品質の低下なく、UIPinchGestureを使用してUILabelのサイズを変更したいと考えています。現時点では、私はそれが本当にぼやけていますが、サイズを変更することができます。ここで品質低下のないUILabelのサイズ変更

は私のコードは、これは私のジェスチャー認識器

func handleScale(recognizer: UIPinchGestureRecognizer) 
{ 
    recognizer.view!.transform = CGAffineTransformScale(recognizer.view!.transform, 
     recognizer.scale, recognizer.scale) 
    recognizer.scale = 1 
     recognizer.view!.frame = CGRectMake(recognizer.view!.frame.minX, recognizer.view!.frame.minY, recognizer.view!.frame.width, recognizer.view!.frame.height) 

    println(recognizer.view!.frame) 
    println(self.label.font.fontWithSize(recognizer.view!.frame.height)) 
    println(self.label.frame) 

} 

ある

label = UILabel(frame:CGRectMake(0,100,300,50)) 
    label.text = "Hellow World" 
    label.textColor = UIColor.blueColor() 
    label.font = UIFont(name: "HelveticaNeue-Bold", size: self.label.frame.height) 
    self.view.addSubview(label) 

    self.resizeRecognizer = UIPinchGestureRecognizer(target: self, action: Selector("handleScale:")) 
    self.rotateRecognizer = UIRotationGestureRecognizer(target: self, action: Selector("handleRotate:")) 

    label.userInteractionEnabled = true 
    label.addGestureRecognizer(self.resizeRecognizer) 

あるラベルの枠がスケーリングされたときに、テキストのサイズはまた、変更する必要がありますされて何をここで発生する必要がありますよく私は、フレームを変更するよう ので、フォントサイズがこれは私が私がからフォントサイズことを作ってみましたが、枠を調整して、フォントサイズを調整しない

<UICTFont: 0x7ffb39e17ba0> font-family: "Helvetica Neue"; font-weight: bold; font-style: normal; font-size: 578.77pt 
<UICTFont: 0x7ffb3ca03ed0> font-family: "Helvetica Neue"; font-weight: bold; font-style: normal; font-size: 594.29pt 

になってきたものですlabel.font = UIFont(name: "HelveticaNeue-Bold", size: self.label.frame.height)

を変更する必要がありますそれは鮮明になります。 私が考えていることは、実際のラベルが再びレンダリングされていないことです。 誰が何が起こっているのか、それを修正する方法を知っていますか?編集

上部のテキストは、私が再スケール後に起こるしたいものであるが、下部のテキストが

Top = Correct, Botton = Incorrect

私は、これは私が作成した実現方法を何が起こっているかであります古いラベルのサイズを変更した新しいラベルがサブビューに追加されました。リセール時にこれを行うことができたらいいですか?

+0

を試してみてください。 – gabuh

+0

@gabuh label.adjustsFontSizeToFitWidth = true;何もしない – Johno2110

答えて

0

maxiumumに収まるフォントサイズでUILabelを作成します。規模。次に、transformプロパティを使用して、初期サイズにスケーリングします。また、adjustsFontSizeToFitWidthをfalseに設定します。

+0

ありがとう、私はそれをコーディングしようとしたが、私はあなたが意味するものを取得していない "その後、最初のサイズに変換するプロパティを使用する" – Johno2110

+0

あなたのUITextFieldの高さは、最大500ポイントの高さにスケールアップすることができます。最初に、500ポイントの高さに一致するフォントサイズを試行錯誤で探す必要があります。次に、フレームの高さを500に設定し、幅をコンテンツの幅に設定します(たとえば、sizeThatFitsまたはsizeToFitメソッドを使用)。最後に、transformプロパティ、 'textField.transform = CGAffineTransformMakeScale(0.1、0.1)'を使用してテキストフィールドを拡大縮小します。 – lassej

+0

これをコード化したばかりですが、ラベルが初期サイズになっているときは、スケールアップするまでまだぼやけています。 – Johno2110

1

私はフォントサイズを更新していないと思いますが、fontWithSizeはラベルに割り当てるフォントを返します。

func handleScale(recognizer: UIPinchGestureRecognizer) 
{ 
    self.test.transform = CGAffineTransformScale(self.test.transform, recognizer.scale, recognizer.scale) 
    recognizer.scale = 1 


    println(recognizer.view!.frame) 


    self.test.font = self.test.font.fontWithSize(recognizer.view!.frame.height) 
    println(self.test.font) 
    println(self.test.frame) 


} 
+0

私はそれを試みましたが、それでもラベルのフォントサイズは変更されません。 – Johno2110

0

私はあなたのコードをコピーして、上記のコードがラベルフレームを更新するだけであることを理解しました。実際にフォントサイズが期待どおりに更新されていません。

以下のコードに従うと、その違いをはっきりと確認できます。

import UIKit 

class ViewController: UIViewController { 

    var resizeRecognizer: UIPinchGestureRecognizer! 
    var rotateRecognizer: UIRotationGestureRecognizer! 
    var label: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     label = UILabel(frame:CGRectMake(50,300,300,50)) 
     label.text = "Hello World" 
     label.textColor = UIColor.blueColor() 
     label.font = UIFont(name: "HelveticaNeue-Bold", size: 18) 
     label.backgroundColor = UIColor.darkGrayColor() 
     self.view.addSubview(label) 

     self.resizeRecognizer = UIPinchGestureRecognizer() 
     self.resizeRecognizer.addTarget(self, action: Selector("handleScale:")) 
     label.userInteractionEnabled = true 
     label.addGestureRecognizer(self.resizeRecognizer) 
    } 

    func handleScale(recognizer: UIPinchGestureRecognizer) 
    { 
     recognizer.view!.transform = CGAffineTransformScale(recognizer.view!.transform, 
      recognizer.scale, recognizer.scale) 
     recognizer.scale = 1 
     recognizer.view!.frame = CGRectMake(0, recognizer.view!.frame.minY, recognizer.view!.frame.width, recognizer.view!.frame.height) 

     label.frame = CGRectMake(recognizer.view!.frame.minX, recognizer.view!.frame.minY, recognizer.view!.frame.width, recognizer.view!.frame.height) 
     label.font = UIFont(name: self.label.font.fontName, size: recognizer.view!.frame.height) 

     // Or Suggested solution 
     var fontSize = CGFloat(recognizer.view!.frame.height/2) 

     label.font = UIFont(name: self.label.font.fontName, size: recognizer.view!.frame.height - fontSize) 

    } 
} 
+0

@ Johno2110:この回答を確認し、結果を確認してください。 – Kampai

+0

私はこれを私のコードに入れました、それは私がまだ来たところで最も近いですが、テキストは枠に関連して変形しません。私が達成したいのは、フレームが拡大縮小されていてもテキストがぼやけていない場合です。 – Johno2110

+0

私はテキストがぼやけていないことを確認しました。テキストの境界に灰色の線が表示されるのは、テキストのデフォルトの影の色です。 – Kampai

0

trueにUILabelの `adjustsFontSizeToFitWidth」プロパティを設定してみてください、と手動でフォントサイズを変更しないでください。この

import UIKit 

class ViewController: UIViewController { 

let label = UILabel() 
let pinchRecognizer = UIPinchGestureRecognizer() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    label.text = "first line\nsecond line" 
    label.textAlignment = NSTextAlignment.Center 
    label.font = UIFont(name: "Menlo-Regular", size: 25) 
    label.numberOfLines = 0 
    label.sizeToFit() 
    label.center = self.view.center 
    self.view.addSubview(label) 

    pinchRecognizer.addTarget(self, action: "changeFontSize") 
    self.view.addGestureRecognizer(pinchRecognizer) 
} 

func changeFontSize() { 

    if pinchRecognizer.state == .Began { 

     pinchRecognizer.scale = label.font.pointSize * 0.1 
    } 

    if 1 <= pinchRecognizer.scale && pinchRecognizer.scale <= 5 { 

     let cent = label.center 
     label.font = UIFont(name: label.font.fontName, size: pinchRecognizer.scale * 10) 
     label.frame.size.width = 999 
     label.numberOfLines = 2 
     label.sizeToFit() 
     label.center = cent 
    } 
} 


}