решение, основанное на визуализации изображения, где метка отображается с размером шрифта, мы можем получить, когда персонаж начинает и где она заканчивается. С этим мы можем определить высоту текущего символа в пикселях. Следующая часть - дать ярлыку новый размер шрифта, а затем повторить предыдущий шаг, сделав изображение. Это даст одинаковый размер персонажа независимо от шрифта.
Чтобы использовать его, вам необходимо добавить следующий код к контроллеру, а затем просто вызвать метод 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
}
}
Если установить шрифт, чтобы быть 200px полукокс не будет точно 200px, так как она будет иметь некоторые расстояние сверху и снизу, это расстояние, которое мне нужно удалить, прежде чем использовать sizeToFit –
Оформить заказ Я добавил к первоначальному ответу. Надеюсь, он предоставит вам все необходимое для решения проблемы. –
Спасибо, я проверю его и вернусь к вам позже –