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