2015-10-24 2 views
0

Эта проблема прослушивала меня довольно долго. Зачастую, когда я компоную UILabel в Storyboard, я хочу, чтобы он масштабировался с разной шириной экрана. Я использую это, создавая ограничение, которое устанавливает его ширину как пропорциональную ширине своего супервизора.Почему автошина работает неправильно?

Затем я установил размер текста в 300, включил автозапуск и установил минимальный размер в 1. Идеально это уменьшило бы текст, чтобы он был максимально возможным при установке ограничений.

Но, это случается.

example

Метка на левой имеет Autoshrink на и пока текст не расширяется, чтобы заполнить (желтый просто фон лейбла, а не другой вид). С другой стороны, метка справа имеет фиксированный размер, но с той же шириной, что показывает, что шрифт имеет гораздо больше возможностей для роста.

Что случилось? Любые исправления будут оценены.

+0

является ярлыком от края до края до обоих примеров? Можете ли вы добавить еще два скриншота о том, что происходит, когда у вас есть очень большое слово? – Korpel

+0

@ Korpel этикеток не на цветном фоне, цвета - это фон ярлыка. Имеет ли это смысл? – Joshua

+0

из c. Вы пытались использовать меньшую метку вместо того, чтобы использовать эту огромную метку? Вместо этого замените ее на UIView и дайте ярлыку выбрать меньшее пространство и повторите попытку? – Korpel

ответ

2

После проб и ошибок, я нашел обходное решение этой проблемы, которая сжимает шрифты с меньшими интервалами в 1, чтобы лучше соответствовать ширине этикетки.

extension UILabel { 
func shrinkToFitWidth(margin: CGFloat?) { 

    // margin parameter will shrink the font by a certain amount more than necessary. 
    // Use this if you want a label with smaller text on a bigger background. Otherwise, use 0. 

    var initialSize : CGSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font]) 

    if initialSize.width > self.frame.size.width 
    { 
     while initialSize.width > self.frame.size.width 
     { 
      self.font = self.font.fontWithSize(self.font.pointSize - 1) 
      initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font]) 
     } 
    } else { 
     while initialSize.width < self.frame.size.width 
     { 
      self.font = self.font.fontWithSize(self.font.pointSize + 1) 
      initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font]) 
     } 
     // went 1 point too large so compensate here 
     self.font = self.font.fontWithSize(self.font.pointSize - 1) 
    } 

    self.font = self.font.fontWithSize(self.font.pointSize - margin!) 
} 

func shrinkToFitHeight(margin: CGFloat?) { 

    // margin parameter will shrink the font by a certain amount more than necessary. 
    // Use this if you want a label with smaller text on a bigger background. Otherwise, use 0. 

    var initialSize : CGSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font]) 

    if initialSize.height > self.frame.size.height 
    { 
     while initialSize.height > self.frame.size.height 
     { 
      self.font = self.font.fontWithSize(self.font.pointSize - 1) 
      initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font]) 
     } 
    } else { 
     while initialSize.height < self.frame.size.height 
     { 
      self.font = self.font.fontWithSize(self.font.pointSize + 1) 
      initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font]) 
     } 

     // went 1 point too large so compensate here 
     self.font = self.font.fontWithSize(self.font.pointSize - 1) 
    } 

    self.font = self.font.fontWithSize(self.font.pointSize - margin!) 
} 

Обратите внимание, что для того, чтобы осуществить это, он должен быть вызван в viewDidLayoutSubviews методе а контроллер вида так, что ограничения будут применены.

Cheers!

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