2015-06-20 6 views
0

Я хочу использовать стандартный UIButton но текст, который я хочу поставить на UIButton есть ...Multiline UIButton авторазмер на линии

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

enter image description here

Таким образом, даже жесткий, я хотел бы установить (предпочтительный) размер шрифта для каждой строки, я хочу, чтобы размер шрифта автоматически размер вниз так, что каждая отдельная линия вписывается в UIButton (= же поведение как UILabel AutoShrink/Minimum Font Scale).

То, что я не хочу:

Я не хочу, чтобы начать добавлять UILabels к UIButton (как подвид, например) или с помощью IB поместить UILabels на сцену и просто нарисовать UIButton вокруг него (почему: Я хочу, чтобы стандартное поведение UIButton подсветки)

что я хочу:

чистым решение, используя приписываемую строку, что с учетом ширина масштабируется вниз шрифт (обновляющий приписываемое ул кольцо, я думаю), по очереди, если потребуется.

Моя идея, реализовать такую ​​функцию:

func addToAttributedString(attString : NSMutableAttributedString, plainString : String, font : UIFont, preferredSize : CGFloat, maxWidth : CGFloat) 

И тогда я мог бы сделать приписываемое строку путем вызова этого с текстом 1,2,3 ... и вставить символ новой строки (\ п) между их.

Любые идеи?

+0

Если вы UILabel вместо UIButton у вас есть опция «AutoShrink» в xib для установки «MinimumFontSize». – alishaik786

ответ

3

sizeToFit() поможет вам отрегулировать высоту как текст.

var str : NSMutableAttributedString = NSMutableAttributedString(string: "Bla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla\nBla") 
    str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSRange(location: 13,length: 3)) 
    button.setAttributedTitle(str, forState: UIControlState.Normal) 
    button.titleLabel!.lineBreakMode = .ByWordWrapping 
    button.titleLabel?.textAlignment = .Center 
    button.titleLabel?.adjustsFontSizeToFitWidth = true 
    button.sizeToFit() 
    button.layoutIfNeeded() 

Работа с кодом тоже:

var attrString = NSMutableAttributedString() 
    addNewLineToAttributedString(attrString, plainString: "Big title", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller Smaller Smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller Smaller Smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Big title", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Big title", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller Smaller Smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller Smaller Smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller Smaller Smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    addNewLineToAttributedString(attrString, plainString: "Smaller Smaller Smaller text", font: UIFont.systemFontOfSize(10), preferredSize: 50, maxWidth: 100) 
    button.setAttributedTitle(attrString, forState: UIControlState.Normal) 
    button.titleLabel!.lineBreakMode = .ByWordWrapping 
    button.titleLabel?.textAlignment = .Center 
    button.titleLabel?.adjustsFontSizeToFitWidth = true 
    button.sizeToFit() 
    button.layoutIfNeeded() 

enter image description here

+0

Это не работает для многострочного текста. Я считаю, что – HixField

+0

попробовал это, но не дал требуемых результатов. Обратите внимание, что 4 строки, разделенные символом \ n, также имеют разный шрифт (подчеркивание, полужирный) и другой предпочтительный размер – HixField

+0

Да, конечно, он работает с моим кодом, потому что addNewLineToAttributedString регулирует размер строки для ширины! – HixField

2

Вы можете достичь его с помощью раскадровки это сам. Просто выполнить это шаги

1: Изменить тип кнопки из системы к логотипо.

enter image description here

2: Изменение Кнопка Название От равнину к приписывали.

3: Введите текст в textArea и нажмите Alt + Enter, когда вам нужна новая линия. см. изображение, это сломает мой текст на 3 строки.

enter image description here

4: режим перерыва Теперь установите линии Character Wrap.

enter image description here

ПРИМЕЧАНИЕ: Если вы не видите текст в отдельной строке в раскадровке изменения текста выравнивания из Align естественно Выровнять влево. установить в качестве выбора участка в изображении

enter image description here

5: Теперь выберите отдельные строки и набор шрифтов. U также может изменить textColor.

enter image description here

6: Повтор Step5 для каждой линии.

вот мой выход имитатора:

enter image description here

+0

+1 для ALT - ВВЕДИТЕ, чтобы начать новую линию! Однако, извините за то, что вы не указали это в вопросе орг, но текст установлен программно. Я понял решение, см. Мой ответ ниже :) – HixField

0

Разобрался решение (взгляните на мой блог http://www.hixfield.net/blog/2015/06/multiline-uibutton-with-each-line-resized-to-fit-width/ для получения дополнительной информации)

class ViewController: UIViewController { 

    //the button that we are formatting 
    @IBOutlet weak var btn: UIButton! 

    //setup our button in the will appear function 
    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     setupBtn() 
    } 

    //function that does the magic 
    func setupBtn() { 
     btn.titleLabel?.lineBreakMode=NSLineBreakMode.ByWordWrapping 
     var attrString = NSMutableAttributedString() 
     var attr = [NSFontAttributeName : UIFont.systemFontOfSize(10)] 
     attrString += (NSMutableAttributedString(string : "Big title", font: UIFont.systemFontOfSize(50), maxWidth: 100)! + "\n") 
     attrString += (NSMutableAttributedString(string : "Smaller text", font: UIFont.systemFontOfSize(50), maxWidth: 100)! + "\n") 
     attrString += (NSMutableAttributedString(string : "Smaller smaller text", font: UIFont.systemFontOfSize(80), maxWidth: 100)! + "\n") 
     btn.setAttributedTitle(attrString, forState: UIControlState.Normal) 
    } 
} 

//************************ 

extension NSMutableAttributedString { 
    /**Makes an attributes string with the specified (plain) string and font but resizes the font smaller 
    to fit the width if required. Can return nil, if there is no way to make it fit*/ 
    convenience init?(string : String, font : UIFont, maxWidth : CGFloat){ 
     self.init() 
     for var size = font.pointSize ; size>1 ; size-- { 
      let attrs = [NSFontAttributeName : font.fontWithSize(size)] 
      let attrString = NSAttributedString(string: string, attributes: attrs) 
      if attrString.size().width <= maxWidth { 
       self.setAttributedString(attrString) 
       return 
      } 
     } 
     return nil 
    } 
} 

//************************ 

public func += (inout left: NSMutableAttributedString, right: NSAttributedString) { 
    left.appendAttributedString(right) 
} 

public func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString { 
    var result = NSMutableAttributedString(attributedString: right) 
    result.appendAttributedString(right) 
    return result 
} 

public func + (left: NSAttributedString, right: String) -> NSAttributedString { 
    var result = NSMutableAttributedString(attributedString: left) 
    result.appendAttributedString(NSAttributedString(string: right)) 
    return result 
} 

enter image description here

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