2015-02-26 4 views
1

В любом случае, чтобы определить, была ли активирована настройкаFontSizeToFitWidth? Мое приложение имеет UILabel, который занимает весь вид. Используя UIPinchGestureRecognizer, вы можете вставлять и изменять размер шрифта. Прекрасно работает. Однако, когда шрифт достигает максимального размера для UILabel, он отображает странное поведение. Текст в UILabel перемещается вниз по UILabel. Без добавления bannerLabel.adjustsFontSizeToFitWidth = true текст обрезается. Я хотел бы знать, когда шрифт имеет максимальный размер для UILabel, и я перестану пытаться увеличить размер шрифта.Любой способ определить, срабатывает ли настройкаFontSizeToFitWidth?

import UIKit 

class ViewController: UIViewController, UIGestureRecognizerDelegate { 

    @IBOutlet weak var bannerLabel: UILabel! 

    var perviousScale:CGFloat = 0 
    var fontSize:CGFloat   = 0 
    var originalFontSize: CGFloat = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let pinchGesture = UIPinchGestureRecognizer(target: self, action: Selector("pinch:")) 
     view.addGestureRecognizer(pinchGesture) 
     perviousScale = pinchGesture.scale 

     bannerLabel.adjustsFontSizeToFitWidth = true 

     originalFontSize = bannerLabel.font.pointSize 
     fontSize   = originalFontSize 

    } 

    func pinch(sender:UIPinchGestureRecognizer) { 

     println("font size \(bannerLabel.font.pointSize)") 

     if perviousScale >= sender.scale //Zoom In 
     { 
      decreaseFontSize() 

     } 
     else if perviousScale < sender.scale //Zoom Out 
     { 
      increaseFontSize() 
     } 

    } 

    func threeFingers(sender:UIPanGestureRecognizer) { 

     println("threeFingers") 

    } 

    override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { 

     bannerLabel.font = UIFont(name: bannerLabel.font.fontName, size: fontSize) 

    } 

    func increaseFontSize(){ 

     bannerLabel.font = UIFont(name: bannerLabel.font.fontName, size: fontSize) 

     fontSize = fontSize + 2.5 

    } 

    func decreaseFontSize(){ 

     bannerLabel.font = UIFont(name: bannerLabel.font.fontName, size: fontSize) 

     if fontSize >= originalFontSize { 

      fontSize = fontSize - 2.5 
     } 
    } 
} 

ответ

0

Да, вы можете добавить наблюдатель:

1) Добавить динамический модификатор свойства вы хотели бы наблюдать:

dynamic UILabel bannerLabel = UILabel() 

2) Создать глобальный контекст переменной

private var myContext = 0 

3) Добавить наблюдателя для ключевого пути

bannerLabel.addObserver(self, forKeyPath: "adjustsFontSizeToFitWidth", options:.New, context:&myContext)  

4) Override observeValueForKeyPath и удалить наблюдателя в Deinit

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject: AnyObject], context: UnsafeMutablePointer<Void>) { 
     if context == &myContext { 
      println("Font size adjusted to fit width: \(change[NSKeyValueChangeNewKey])") 
     } else { 
      super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
     } 
    } 

deinit { 
     bannerLabel .removeObserver(self, forKeyPath: "adjustsFontSizeToFitWidth", context: &myContext) 
    } 
+0

Спасибо. Как это реализовать, я никогда раньше не использовал '.addObserver'. Когда я добавляю строку, я получаю следующую ошибку: 'Не могу вызывать 'addObserver' со списком аргументов типа '(ViewController, forKeyPath: String, options: String, context: nil)'' –

+0

Извините, см. Мои правки на полное решение –

+0

'dynamic UILabel bannerLabel = UILabel()' дает мне следующую ошибку 'последовательные объявления в строке должны быть разделены символом ';'' –

Смежные вопросы