2016-02-04 4 views
0

У меня возникают проблемы с созданием NSMutableAttributedString и sizeThatFits. У меня есть UILabel, который должен быть не шире, чем константа self.frame.size.width-usernameX-horizontalMargin. Я хочу, чтобы UILabel была одной строкой, если она подходит или две строки с дефисом, если она слишком длинная. В настоящее время я использую этот код:Выполнение NSMutableAttributedString и sizeThatFits работают вместе

let usernameX = profilePhoto.frame.size.width+horizontalMargin 
let username = UILabel() 
username.adjustsFontSizeToFitWidth = false 
username.font = UIFont(name: "SFUIDisplay-Regular", size: 18) 
username.numberOfLines = 0 
username.translatesAutoresizingMaskIntoConstraints = false 

//Set hyphenation 
let paragraphStyle = NSMutableParagraphStyle() 
paragraphStyle.hyphenationFactor = 0.2 
username.attributedText = NSMutableAttributedString(string: displayName, attributes: [NSParagraphStyleAttributeName: paragraphStyle]) 
let maxSize = CGSize(width: self.frame.size.width-usernameX-horizontalMargin, height: CGFloat.max) 
let requiredSize = username.sizeThatFits(maxSize) 
username.frame = CGRect(x: usernameX, y: (self.frame.size.height/2)-21, width: requiredSize.width, height: requiredSize.height) 

self.addSubview(username) 

В настоящее время текст отображается как одна строка с дефисом. Вторая строка не отображается. Какие-нибудь идеи, что я могу делать неправильно здесь? Я попытался установить количество строк на 2, что не имело никакого значения. Любые указатели будут действительно оценены.

Спасибо!

ответ

0

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

let attributedString = NSMutableAttributedString(string: displayName, attributes: [NSParagraphStyleAttributeName: paragraphStyle, NSFontAttributeName : UIFont(name: "SFUIDisplay-Regular", size: 18)]) 
var newFrame = attributedString.boundingRectWithSize(CGSizeMake(self.frame.size.width-usernameX-horizontalMargin, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin , context: nil) 
username.frame = CGRect(x: usernameX, y: (self.frame.size.height/2)-21, width: newFrame.size.width, height: newFrame.size.height) 

Если вы хотите использовать sizeThatFits вы можете использовать следующие

let paragraphStyle = NSMutableParagraphStyle() 
paragraphStyle.hyphenationFactor = 0.2 
username.attributedText = NSMutableAttributedString(string: displayName, attributes: [NSParagraphStyleAttributeName: paragraphStyle, NSFontAttributeName : UIFont(name: "SFUIDisplay-Regular", size: 18)]) 
let maxSize = CGSize(width: self.frame.size.width-usernameX-horizontalMargin, height: CGFloat.max) 
let requiredSize = username.sizeThatFits(maxSize) 
username.frame = CGRect(x: usernameX, y: (self.frame.size.height/2)-21, width: requiredSize.width, height: requiredSize.height) 

self.addSubview(username) 
+0

Просто попробовал ваш код. Никакой разницы нет. Интересно, влияют ли ограничения на это ... – KexAri

+0

Можете ли вы установить ограничение по высоте для своей метки и изменить ее во время выполнения? –

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