【问题标题】:Resizing UILabel with no quality loss在没有质量损失的情况下调整 UILabel 的大小
【发布时间】:2015-12-27 09:38:25
【问题描述】:

我希望能够使用UIPinchGesture 调整 UILabel 的大小,而不会造成质量损失。目前我可以调整它的大小,虽然它变得非常模糊。

这是我的代码

label = UILabel(frame:CGRectMake(0,100,300,50))
    label.text = "Hellow World"
    label.textColor = UIColor.blueColor()
    label.font = UIFont(name: "HelveticaNeue-Bold", size: self.label.frame.height)
    self.view.addSubview(label)

    self.resizeRecognizer = UIPinchGestureRecognizer(target: self, action: Selector("handleScale:"))
    self.rotateRecognizer = UIRotationGestureRecognizer(target: self, action: Selector("handleRotate:"))

    label.userInteractionEnabled = true
    label.addGestureRecognizer(self.resizeRecognizer)

这是我的手势识别器

func handleScale(recognizer: UIPinchGestureRecognizer)
{
    recognizer.view!.transform = CGAffineTransformScale(recognizer.view!.transform,
        recognizer.scale, recognizer.scale)
    recognizer.scale = 1
        recognizer.view!.frame = CGRectMake(recognizer.view!.frame.minX, recognizer.view!.frame.minY, recognizer.view!.frame.width, recognizer.view!.frame.height)

    println(recognizer.view!.frame)
    println(self.label.font.fontWithSize(recognizer.view!.frame.height))
    println(self.label.frame)

}

这里需要发生的是,当标签框架被缩放时,文本的大小也需要改变。 所以当我改变框架时,字体大小应该改变label.font = UIFont(name: "HelveticaNeue-Bold", size: self.label.frame.height)

这就是我来的目的

<UICTFont: 0x7ffb39e17ba0> font-family: "Helvetica Neue"; font-weight: bold; font-style: normal; font-size: 578.77pt
<UICTFont: 0x7ffb3ca03ed0> font-family: "Helvetica Neue"; font-weight: bold; font-style: normal; font-size: 594.29pt

字体大小确实会随着框架的调整而调整,我已经尝试从一开始就使字体大小变得清晰。 我认为正在发生的是,实际标签不会再次重新呈现。 有谁知道发生了什么或如何解决它?

编辑:

顶部的文字是我想在重新缩放后发生的事情,底部的文字是正在发生的事情

我实现这一点的方法是创建一个具有旧标签大小的新标签,然后将其添加到子视图中,如果这有意义的话,我希望能够在重新缩放时执行此操作

【问题讨论】:

  • 尝试将UILabel的`adjustsFontSizeToFitWidth'属性设置为true,不要手动更改字体大小。
  • @gabuh label.adjustsFontSizeToFitWidth = true;什么都不做

标签: ios cocoa-touch swift


【解决方案1】:

我认为你没有更新字体大小,fontWithSize 返回一个你应该分配给标签的字体。

  func handleScale(recognizer: UIPinchGestureRecognizer)
{
    self.test.transform = CGAffineTransformScale(self.test.transform, recognizer.scale, recognizer.scale)
    recognizer.scale = 1


    println(recognizer.view!.frame)


    self.test.font = self.test.font.fontWithSize(recognizer.view!.frame.height)
    println(self.test.font)
    println(self.test.frame)


}

【讨论】:

  • 我试过了,但它仍然没有改变标签字体大小。
  • 这个解决方案的问题是:当你设置新的更大字体和缩放变换时,它要么使字体变大并对其应用变换,你就会结束仍然有模糊的文本,它的缩放速度是原来的两倍。你真的应该在缩放时只改变字体大小。 @sameh 的回答对我来说很有希望
【解决方案2】:

创建一个字体大小适合您的最大缩放比例的 UILabel。然后使用 transform 属性将其缩放到初始大小。另外,将 adjustsFontSizeToFitWidth 设置为 false。

【讨论】:

  • 谢谢,我已经尝试对其进行编码,但我不明白您所说的“然后使用变换属性将其缩放到初始大小”的意思
  • 说您的 UITextField 高度最初应该是 50 点,并且您希望能够将其缩放到最多 500 点的高度。首先,您需要找到与 500 磅高度匹配的字体大小(通过反复试验)。然后将框架高度设置为 500,将其宽度设置为内容的宽度(例如,使用 sizeThatFits 或 sizeToFit 方法)。最后使用 transform 属性缩放文本字段:textField.transform = CGAffineTransformMakeScale( 0.1, 0.1).
  • 好的,我刚刚编码,当标签处于其初始大小时,它仍然是模糊的,直到您将其放大。
【解决方案3】:

我已经复制了您的代码并发现,上面的代码只是更新了标签框架。实际上字体大小并没有像您预期的那样更新。

按照下面的代码,你可以清楚地看到差异。

import UIKit

class ViewController: UIViewController {

    var resizeRecognizer: UIPinchGestureRecognizer!
    var rotateRecognizer: UIRotationGestureRecognizer!
    var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        label = UILabel(frame:CGRectMake(50,300,300,50))
        label.text = "Hello World"
        label.textColor = UIColor.blueColor()
        label.font = UIFont(name: "HelveticaNeue-Bold", size: 18)
        label.backgroundColor = UIColor.darkGrayColor()
        self.view.addSubview(label)

        self.resizeRecognizer = UIPinchGestureRecognizer()
        self.resizeRecognizer.addTarget(self, action: Selector("handleScale:"))
        label.userInteractionEnabled = true
        label.addGestureRecognizer(self.resizeRecognizer)
    }

    func handleScale(recognizer: UIPinchGestureRecognizer)
    {
        recognizer.view!.transform = CGAffineTransformScale(recognizer.view!.transform,
            recognizer.scale, recognizer.scale)
        recognizer.scale = 1
        recognizer.view!.frame = CGRectMake(0, recognizer.view!.frame.minY, recognizer.view!.frame.width, recognizer.view!.frame.height)

        label.frame = CGRectMake(recognizer.view!.frame.minX, recognizer.view!.frame.minY, recognizer.view!.frame.width, recognizer.view!.frame.height)
        label.font = UIFont(name: self.label.font.fontName, size: recognizer.view!.frame.height)

        // Or Suggested solution
        var fontSize = CGFloat(recognizer.view!.frame.height / 2)

        label.font = UIFont(name: self.label.font.fontName, size: recognizer.view!.frame.height - fontSize)

    }
}

【讨论】:

  • @Johno2110:检查此答案并查看结果。
  • 我已将它放在我的代码中,这是我迄今为止最接近的,但文本不会相对于框架进行转换,如果将其放大,文本会消失。我希望能够实现的是当框架被缩放但文本不模糊时。
  • 我检查了文字是否模糊。如果您在文本边框处看到灰色线条,则它是文本的默认阴影颜色。
  • 我知道你的方法不会产生模糊的文本,但是缩放并没有真正起作用,当缩放到太多时,文本会消失
  • 这里标签高度与标签高度成正比,字体点大小行为不同我的意思是对于不同的字体,它的大小反应不同。如何检查已编辑的答案,我已经提到了另一种解决方案,但是如果我们降低比率,它将变得模糊。
【解决方案4】:

试试这个

import UIKit

class ViewController: UIViewController {

let label = UILabel()
let pinchRecognizer = UIPinchGestureRecognizer()

override func viewDidLoad() {
    super.viewDidLoad()

    label.text = "first line\nsecond line"
    label.textAlignment = NSTextAlignment.Center
    label.font = UIFont(name: "Menlo-Regular", size: 25)
    label.numberOfLines = 0
    label.sizeToFit()
    label.center = self.view.center
    self.view.addSubview(label)

    pinchRecognizer.addTarget(self, action: "changeFontSize")
    self.view.addGestureRecognizer(pinchRecognizer)
}

func changeFontSize() {

    if pinchRecognizer.state == .Began {

        pinchRecognizer.scale = label.font.pointSize * 0.1
    }

    if 1 <= pinchRecognizer.scale && pinchRecognizer.scale <= 5  {

        let cent = label.center
        label.font = UIFont(name: label.font.fontName, size: pinchRecognizer.scale * 10)
        label.frame.size.width = 999
        label.numberOfLines = 2
        label.sizeToFit()
        label.center = cent 
    }
}


}

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    相关资源
    最近更新 更多