Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 按比例缩小的标签的质量_Ios_Swift_Uiview_Uilabel_Scaling - Fatal编程技术网

Ios 按比例缩小的标签的质量

Ios 按比例缩小的标签的质量,ios,swift,uiview,uilabel,scaling,Ios,Swift,Uiview,Uilabel,Scaling,我正在使用Swift 3创建一个iOS界面,其中一些包含(除其他外)UILabels的UIViews根据它们在屏幕上的位置进行放大和缩小。我的第一种方法是创建并填充大尺寸(比如100x100)的视图,然后使用cGraffeTransform(scaleX:y:)根据需要缩放它们,但是我注意到标签中文本的缩小一点也不优雅,文本变得像素化,在小比例下几乎无法读取。作为比较(参见下面的示例),直接更改字体大小会得到更好的结果,但是我的视图中的结构有些复杂,必须根据一些大小因子重新绘制所有内容会很麻烦。

我正在使用Swift 3创建一个iOS界面,其中一些包含(除其他外)
UILabel
s的
UIView
s根据它们在屏幕上的位置进行放大和缩小。我的第一种方法是创建并填充大尺寸(比如100x100)的视图,然后使用
cGraffeTransform(scaleX:y:)
根据需要缩放它们,但是我注意到标签中文本的缩小一点也不优雅,文本变得像素化,在小比例下几乎无法读取。作为比较(参见下面的示例),直接更改字体大小会得到更好的结果,但是我的视图中的结构有些复杂,必须根据一些大小因子重新绘制所有内容会很麻烦。有没有更好更顺畅的方法来解决这个问题

下面是我创建的一个示例项目来说明这个问题,以及模拟器中的输出(与iPhone本身相同),缩小的视图位于左侧(红色),更改的字体大小位于右侧(绿色)

这可能是一个答案,但并不适合评论,所以

试一试-它使用
创建第三列黄色背景视图。adjustsFontSizeToFitWidth
。字体大小将根据包含标签的视图大小自动调整

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    for i in 1...10 {
        let f = CGFloat(1.0) / CGFloat(i)
        let view1 = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
        view1.backgroundColor = UIColor.red
        let label1 = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
        label1.text = "\(100 / i)%"
        label1.font = UIFont(name: "Verdana", size: 24.0)
        label1.textAlignment = .right
        view1.addSubview(label1)
        view1.transform = CGAffineTransform(scaleX: f, y: f)
        view1.center = CGPoint(x: 160 - 75.0 * f, y: CGFloat(60 * i) + 25.0 * f)
        self.view.addSubview(view1)

        let view2 = UIView(frame: CGRect(x: CGFloat(170), y: CGFloat(60 * i), width: 150 * f, height: 50 * f))
        view2.backgroundColor = UIColor.green
        let label2 = UILabel(frame: CGRect(x: 0, y: 0, width: 150 * f, height: 50 * f))
        label2.text = "\(100 / i)%"
        label2.font = UIFont(name: "Verdana", size: 24.0 * f)
        view2.addSubview(label2)
        self.view.addSubview(view2)

        let view3 = UIView(frame: CGRect(x: CGFloat(270), y: CGFloat(60 * i), width: 150 * f, height: 50 * f))
        view3.backgroundColor = UIColor.yellow
        let label3 = UILabel(frame: view3.bounds)
        label3.text = "\(100 / i)%"
        label3.font = UIFont(name: "Verdana", size: 24.0)
        label3.adjustsFontSizeToFitWidth = true
        label3.minimumScaleFactor = 0.05
        label3.numberOfLines = 0
        // we want the label to resize with the view, if the view frame changes
        label3.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view3.autoresizesSubviews = true
        view3.addSubview(label3)
        self.view.addSubview(view3)

    }
}

autolayout在哪里?在本例中,我没有使用任何autolayout,它只是手写代码。是否需要将边界框缩放到特定大小?还是字体?你能使用
.adjustsIntSizeToFitWidth=true
并让它自动缩放字体吗?@DonMag我可能弄错了,但我认为这不是正确的方法。框中的文本大部分是静态的,整个视图的大小会发生变化,并且在视图的生命周期中可能会发生多次变化。据我所知,当文本对于边界框来说太大时,
adjustFontSizeToFitWidth=true
可用于更改文本大小,但在缩小视图时,它没有帮助。我尝试将其添加到代码中,但没有效果。@David-如果您将标签大小设置为随其“容器视图”大小而更改,可能会起作用。请看我的答案,这绝对是一个进步,谢谢!唯一的一点是,文本大小与外部框架大小之间的比率会发生变化,因为文本大小受框架边界的约束,而实际上不会“缩放”。因此,我想我只需将我的
UILabel
s封装在紧密贴合的
UIView
s中即可使用该技术。在我的应用程序中,我有几段文字,所有这些文字都必须根据外部视图的大小进行缩放,我需要一些中间层。我能够几乎准确地再现原始结果,同时保持高质量且不手动更改字体大小,通过使用这种技术并将
ui标签
封装在中间
ui视图
中,我必须调整其高度(字体大小*1.25)以考虑文本周围的空间。也许有更好/更简单的方法,但至少这一种有效且看起来不错。@David-做事的方法(几乎)总是不止一种。。。很高兴你得到了你想要的结果。
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    for i in 1...10 {
        let f = CGFloat(1.0) / CGFloat(i)
        let view1 = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
        view1.backgroundColor = UIColor.red
        let label1 = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
        label1.text = "\(100 / i)%"
        label1.font = UIFont(name: "Verdana", size: 24.0)
        label1.textAlignment = .right
        view1.addSubview(label1)
        view1.transform = CGAffineTransform(scaleX: f, y: f)
        view1.center = CGPoint(x: 160 - 75.0 * f, y: CGFloat(60 * i) + 25.0 * f)
        self.view.addSubview(view1)

        let view2 = UIView(frame: CGRect(x: CGFloat(170), y: CGFloat(60 * i), width: 150 * f, height: 50 * f))
        view2.backgroundColor = UIColor.green
        let label2 = UILabel(frame: CGRect(x: 0, y: 0, width: 150 * f, height: 50 * f))
        label2.text = "\(100 / i)%"
        label2.font = UIFont(name: "Verdana", size: 24.0 * f)
        view2.addSubview(label2)
        self.view.addSubview(view2)

        let view3 = UIView(frame: CGRect(x: CGFloat(270), y: CGFloat(60 * i), width: 150 * f, height: 50 * f))
        view3.backgroundColor = UIColor.yellow
        let label3 = UILabel(frame: view3.bounds)
        label3.text = "\(100 / i)%"
        label3.font = UIFont(name: "Verdana", size: 24.0)
        label3.adjustsFontSizeToFitWidth = true
        label3.minimumScaleFactor = 0.05
        label3.numberOfLines = 0
        // we want the label to resize with the view, if the view frame changes
        label3.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view3.autoresizesSubviews = true
        view3.addSubview(label3)
        self.view.addSubview(view3)

    }
}