在a simple iPhone app中,我在viewDidLoad中通过以下代码显示字母图块(自定义UIView
带有图片和2个标签):
DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile"
owner:self
options:nil] firstObject];
tile.frame = CGRectMake(10 + arc4random_uniform(100),
10 + arc4random_uniform(100),
kWidth,
kHeight);
[self.view addSubview:tile];
这没关系,但是当我向CGRectMake
提供更大的宽度和高度参数时,我想让字母增长 -
因此,在Xcode 5.1 Interface Builder中,我打开DraggedTile.xib
并启用"自动布局"。
然后,对于image
和letter
,我会在父级的左边,顶边,右边和底边添加约束。
对于letter
标签,我还设置了" Lines"到0和"内容压缩阻力优先"到1000(此处fullscreen 1和fullscreen 2):
然后我修改代码以使用更大的宽度和高度:
tile.frame = CGRectMake(10 + arc4random_uniform(100),
10 + arc4random_uniform(100),
2 * kWidth,
2 * kHeight);
结果如下:
背景image
和letter
标签似乎都按预期增长。
然而,标签的字体大小没有增长。
我已经四处寻找,我认为我需要像tile.letter.adjustsFontSizeToFitWidth = YES
这样的东西。但与此同时,我不能将它用于"自动布局"正在......
所以我的问题是,如果" Interface Builder"中有任何选项可以使字体大小增长吗?
更新
我已经尝试过ismailgulek建议在Interface Builder和in the code tile.letter.adjustsFontSizeToFitWidth = YES
中将字体大小设置为200,看起来很有前途(这里fullscreen):< / p>
但我现在遇到的问题是我在Interface Builder中将40px设置为letter.bottom
约束。但是,如果我需要更大的瓷砖框架怎么办?有没有办法在该约束中使用百分比而不是绝对像素值?
另一个问题是否可以在Interface Builder中的某处设置adjustsFontSizeToFitWidth
,或者我是否必须使用源代码?我已经尝试在&#34;用户定义的运行时属性&#34;中添加一个密钥。 - 然后应用程序在运行时崩溃:
答案 0 :(得分:26)
adjustsFontSizeToFitWidth
的{{1}}属性不会增长字体大小,只会根据文档进行缩减:通常情况下,标签文本是使用您指定的UILabel
绘制的字体属性。但是,如果此属性设置为font
,并且text属性中的文本超出了标签的边界矩形,则接收器将开始缩小字体大小,直到字符串适合或达到最小字体大小。
但如果您将字体大小设置得足够大(比如200)并将YES
设置为adjustsFontSizeToFitWidth
,我认为您会获得有趣的宝贵结果。
并且不要忘记将YES
设置为Baseline
,否则您的文字可能无法正常显示。
请告知我们您的结果。
答案 1 :(得分:14)
对于那些来到这里并且需要简单解决方案(在小时调查之后)的人:
问题示例:如果您使用自动布局并将UILabel高度设置为与屏幕高度成比例,那么您将获得一个低于iPhone(横向)和iPad高的帧。如何自动调整字体高度?
Interface Builder中的解决方案,
这会导致字体自动增加到当前高度。
答案 2 :(得分:2)
您可以通过在故事板中设置自动收缩来完成您想要的任务。当屏幕尺寸变小时,它将使标签缩小到最小刻度/显式尺寸。使其在最大的屏幕尺寸上工作,然后确保它缩小到故事板预览中所需的大小。
答案 3 :(得分:1)
您可以将Interface Builder中的类替换为您自己的派生类,并在那里调整大小。
示例:
/**
MYLabel does exactly the same like UILabel, except that the font size will automatically shrink
if the code is executed on an iPhone.
*/
class MYLabel: UILabel {
var onlyOnceToken: dispatch_once_t = 0
override func drawRect(rect: CGRect) {
dispatch_once(&onlyOnceToken) {
if let usedFont:UIFont = self.font {
// define your reference size here
let iPadHeight:CGFloat = 768
let screenBounds = UIScreen.mainScreen().bounds
let scale:CGFloat = screenBounds.height / iPadHeight
self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale)
}
}
super.drawRect(rect)
}
}
从现在开始,您只需要在IB的身份检查器中用 MYLabel 替换 UILabel 类,所有字体都会按比例自动调整大小到您的设备高度。
如果您想将其与标签尺寸一起增长,请替换
let screenBounds = UIScreen.mainScreen().bounds
带
let screenBounds = self.bounds.height
或任何其他自定义比例公式。 UIFont 为您提供了额外的测量属性,您可以使用此方法做很多事情。
答案 4 :(得分:1)
还要确保将“换行”从“自动换行”设置为“截尾”。
答案 5 :(得分:0)
字体不会自动增长。
你应该自己,IB或以编程方式增加/减少它。