2015-08-26 3 views
0

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

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

Я попытался использовать myLabel.adjustsFontSizeToFitWidth = YES;, но это действительно не решает мою проблему, потому что он использует символ greates в тексте, и он по-прежнему добавляет вертикальное дополнение/интервал, который может иметь шрифт.

Изображение должно описывать то, что я хочу выполнить. Вы можете видеть, что высота должна быть 200px и что первый символ ровно 200px без добавления/интервала добавляется вертикально.

У кого-нибудь есть идеи, как это решить?

Заранее спасибо Ватан
enter image description here

ответ

0

решение, основанное на визуализации изображения, где метка отображается с размером шрифта, мы можем получить, когда персонаж начинает и где она заканчивается. С этим мы можем определить высоту текущего символа в пикселях. Следующая часть - дать ярлыку новый размер шрифта, а затем повторить предыдущий шаг, сделав изображение. Это даст одинаковый размер персонажа независимо от шрифта.

Чтобы использовать его, вам необходимо добавить следующий код к контроллеру, а затем просто вызвать метод setSizeFont (sizeFont: CGFloat, center:CGPoint), где sizeFont - желаемый размер символа и центра, где разместить метку (мне нужен этот параметр в моей программе , оно не может быть полезным для других)

Если решение может быть улучшена, пожалуйста, не стесняйтесь редактировать

extension UIImage { 
    func getPixelColor(pos: CGPoint) -> UIColor { 

     var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage)) 
     var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

     var pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 

     var r = CGFloat(data[pixelInfo])/CGFloat(255.0) 
     var g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
     var b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
     var a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

     return UIColor(red: r, green: g, blue: b, alpha: a) 
    } 

    private func getHeight() -> Int { 
     var startHeight = 0 
     var endHeight = Int(round(self.size.height)) 
     outerLoop: for var index = 0; index < Int(round(self.size.height)); index++ { 
      for var j = 0; j < Int(round(self.size.width)); j++ { 
       if(self.getPixelColor(CGPoint(x:j, y:index)) == UIColor(red: 0, green: 0, blue: 0, alpha: 1)) { 
        startHeight = index 
        break outerLoop 
       } 
      } 
     } 

     outerLoop: for var index = Int(round(self.size.height))-1; index >= 0; index -= 1 { 
      for var j = 0; j < Int(round(self.size.width)); j++ { 
       if(self.getPixelColor(CGPoint(x:j, y:index)) == UIColor(red: 0, green: 0, blue: 0, alpha: 1)) { 
        endHeight = index 

        break outerLoop 
       } 
      } 
     } 

     return endHeight-startHeight 
    } 
} 

extension UILabel { 
    func setSizeFont (sizeFont: CGFloat, center:CGPoint) { 

     var str = self.text! 
     str = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 

     var tempLabel = UILabel(frame: self.frame) 
     //Set text to only be the first char 
     tempLabel.text = str.substringWithRange(Range<String.Index>(start: advance(str.startIndex, 0), end: advance(str.startIndex, 1))) 
     tempLabel.font = UIFont(name: self.font.fontName, size: sizeFont)! 
     tempLabel.backgroundColor = UIColor.whiteColor() 
     tempLabel.textColor = UIColor.blackColor() 
     tempLabel.sizeToFit() 


     self.font = UIFont(name: self.font.fontName, size: sizeFont)! 


     var height = tempLabel.generateImg().getHeight() 
     var sizeF = Int(round(sizeFont)) 
     var currSize = sizeF 

     while(height < sizeF) { 
      var diff = sizeF - height 
      if(diff<=5){ 
       currSize++ 
      } else { 
       currSize += diff-5 
      } 
      tempLabel.font = UIFont(name: tempLabel.font.fontName, size: CGFloat(currSize))! 
      tempLabel.sizeToFit() 
      height = tempLabel.generateImg().getHeight() 
     } 

     self.font = UIFont(name: self.font.fontName, size: CGFloat(currSize)) 

     self.sizeToFit() 

     self.center = center 

    } 
    private func generateImg() -> UIImage{ 

     UIGraphicsBeginImageContext(self.bounds.size); 

     // Make the CALayer to draw in our "canvas". 
     self.layer.renderInContext(UIGraphicsGetCurrentContext()) 

     // Fetch an UIImage of our "canvas". 
     var image = UIGraphicsGetImageFromCurrentImageContext(); 

     // Stop the "canvas" from accepting any input. 
     UIGraphicsEndImageContext(); 

     return image 
    } 

} 
0

Если вы хотите высоту UILabel всегда соответствовать высоте первого символа, вы можете использовать sizeToFit но не включают в себя всю строку, только первый персонаж. Затем, после того, как кадр UILabel уже рассчитан, основываясь только на первой букве, вы можете добавить остальную часть текста, и метка будет по-прежнему находиться на требуемой высоте.

Надеюсь, это поможет. Удачи!

EDIT: Вы можете получить точную высоту для персонажа, который вам нужен, исходя из этих характеристик UIFont. Образ объясняет это очень хорошо. Вам может понадобиться несколько иной расчет на основе характера вы сейчас имеем дело, но, как вы можете видеть на картинке, у вас есть все необходимые данные для расчета: A great visualization of UIFont properties

+0

Если установить шрифт, чтобы быть 200px полукокс не будет точно 200px, так как она будет иметь некоторые расстояние сверху и снизу, это расстояние, которое мне нужно удалить, прежде чем использовать sizeToFit –

+0

Оформить заказ Я добавил к первоначальному ответу. Надеюсь, он предоставит вам все необходимое для решения проблемы. –

+0

Спасибо, я проверю его и вернусь к вам позже –

0
[labelAutoResizeCheck setFont:[UIFont fontWithName:labelAutoResizeCheck.font.fontName size:90]]; 

после установки шрифта , сделай это ..

CGSize sizeAsPerText = [labelAutoResizeCheck.text sizeWithFont:labelAutoResizeCheck.font]; 
[labelAutoResizeCheck setFrame:CGRectMake(labelAutoResizeCheck.frame.origin.x, labelAutoResizeCheck.frame.origin.y, sizeAsPerText.width, sizeAsPerText.height)]; 
+0

привет, как бы написать это с быстрым и в xcode 6, так как некоторые функции не существуют? –

+0

@VatanBytyqi на моем Xcode 6.4, для быстрой, после установки текста и шрифта на ярлык, я просто делаю label.sizeToFit(). его работы хорошо –

+0

Если вы проверите его более подробно, вы увидите, что символ не является точно предпочтительным размером, потому что шрифты имеют некоторый интервал для разных символов och. –

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