最近,我正在研究我们公司产品的新UI。并调整iphone 6 plus的文字大小对我来说真的是一个问题。我甚至没有找到一种优雅的方式。然而,我对一些任务期间称为“奖金”的题外话感到好奇。 (事实上,这是我对这个问题的主要怀疑)。
我想出的文本大小的解决方案是使用fontdescriptor来改变点大小,这样我就可以将这个技巧应用于任何字体样式。我使用Bond绑定来观察文本的变化。
lazy var bondFontSizeForIP6P = Bond<(NSAttributedString, UILabel)>{ (s, label) in
if SRDevice.getVersion == .IPHONE6PLUS{
let scaleFactor:CGFloat = 1.3
let fd = label.font.fontDescriptor()
let pointSize = fd.pointSize * scaleFactor
let font = UIFont(descriptor: fd, size: pointSize)
label.font = font
}
}
zip(cell.distanceLabel.dynAttributedText, cell.distanceLabel) ->> bondFontSizeForIP6P
它有效,但很明显它无法涵盖所有条件,至少标签更频繁地更改带有字符串属性的文本。所以我认为如果有更通用的替代方法。我尝试使用协议来暗示领域文章中提到的泛型:Swift - Enums, Pattern Matching & Generics
protocol StringLike {}
extension String:StringLike{}
extension NSAttributedString:StringLike{}
我添加了此协议并更改了我的关闭bondFontSizeForIP6P
lazy var bondFontSizeForIP6P = Bond<(StringLike, UILabel)>{ (s, label) in
if SRDevice.getVersion == .IPHONE6PLUS{
let scaleFactor:CGFloat = 1.3
let fd = label.font.fontDescriptor()
let pointSize = fd.pointSize * scaleFactor
let font = UIFont(descriptor: fd, size: pointSize)
label.font = font
}
}
并将此侦听器与两个观察者绑定。
zip(cell.distanceLabel.dynAttributedText, cell.distanceLabel) ->> bondFontSizeForIP6P
zip(cell.speedLabel.dynText, cell.speedLabel) ->> bondFontSizeForIP6P
显然,这不是一次成功的尝试,这就是我在这里的原因。错误日志在这里:
Binary operator '->>' cannot be applied to operands of type 'Dynamic<(NSAttributedString, UILabel!)>' and 'Bond<(StringLike, UILabel)>'
事实上,除了这个approche之外,我还尝试了另一种方法,比如将类型更改为更原始的类型,如Any,AnyObject Bond<Any>
,但String不是AnyObject,NSAttributedString不是Any。
所以我的问题是,这意味着无法使用泛型类型来描述String和NSAttributedString,或者我没有意识到任何盲点?