Ios BoundingRectWithSize-选择字体&;使用的字体大小

Ios BoundingRectWithSize-选择字体&;使用的字体大小,ios,swift,fonts,uibutton,uilabel,Ios,Swift,Fonts,Uibutton,Uilabel,我使用BoundingRectize返回一个CGRect,它将适当地修复我的文本。 我以前有这个代码 var maximumLabelSize: CGSize = CGSize(width: view.bounds.width-5, height: 150) var maximumLabelSize: CGSize = CGSize(width: view.bounds.width-5, height: 150) var labelRect: CGRect = (mat

我使用BoundingRectize返回一个CGRect,它将适当地修复我的文本。 我以前有这个代码

var maximumLabelSize: CGSize = CGSize(width: view.bounds.width-5, height: 150)
         var maximumLabelSize: CGSize = CGSize(width: view.bounds.width-5, height: 150)
    var labelRect: CGRect = (matches[indexPath.item].name as NSString).boundingRectWithSize(maximumLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16)], context: nil)
将字体更改为Helviticanue粗体时,我的许多标签没有全屏显示。我的假设是,由于我将字体改为粗体,文本不再适合它们的边界CGRECT,因此将字符串缩短

我建议的修复方法是编辑为我的文本创建初始适当边界CGRect的代码,以考虑文本的粗体性质。这是我的尝试

var labelRect: CGRect = (matches[indexPath.item].name as NSString).boundingRectWithSize(maximumLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont(name: "HelveticaNeue-Bold", size: 16)], context: nil)
我得到一个错误,我提供的参数不正确

Cannot invoke 'boundingRectWithSize' with an argument list of type '(CGSize, options: NSStringDrawingOptions, attributes: [String : UIFont?], context: nil)'
根据iOS开发者库,这些是合适的参数

func boundingRectWithSize(_ size: CGSize,
                  options options: NSStringDrawingOptions,
               attributes attributes: [String : AnyObject]?,
                  context context: NSStringDrawingContext?) -> CGRect
冲突在属性中,显然是我改变的区域,但至少这证实了这一点。我不确定如何进一步寻求解决办法。理解这一点的任何帮助都将不胜感激。

UIFont(名称、大小)有一个“可选”输出。而且,boundingRectWithSize不接受带有名称的UIFont的可选输出。试试这个:它很管用

if let font = UIFont(name: "HelveticaNeue-Bold", size: 16) {
        var labelRect2: CGRect = ("Random String" as NSString).boundingRectWithSize(maximumLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

}

在进一步分析我自己提供的BoundingRectize参数与iOS开发者库中列出的参数之间的对比后,我想知道如果我将UIFont强制转换为AnyObject会发生什么

var labelRect: CGRect = (matches[indexPath.item].name as NSString).boundingRectWithSize(maximumLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont(name: "HelveticaNeue-Bold", size: 16) as! AnyObject], context: nil)

boundingRectWithSize的attributes参数接受类型[String:AnyObject],而我应该提供[String:UIFont?]。我铸造了我的字体?对任何物体。这消除了错误,也解决了我的问题。粗体文本不再缩短。已解决。

这消除了错误,但并没有停止删除粗体文本。原始boundingRectWithSize调用请求类型[String:AnyObject]中的“attributes”参数
[NSFontAttributeName:UIFont.systemFontOfSize(16)]
满足以下条件。如何将
UIFont.systemFontOfSize(16)
类型设置为任何对象,而
UIFont(名称:“HelveticaNeue Bold”,大小:16)
类型设置为UIFont?处理可选项并没有消除错误,尽管它不能阻止边界框不正确。我可以输入的唯一区别是类型差异。。假设类型差异。我不确定您的可选修复是否导致参数从UIFont更改为AnyObject。那么错误可能存在于其他地方。如果您打印这两个对象的对象,那么这两个对象实际上是同一类型的。您将获得:字体系列:“.HelveticaNeueInterface Regular”;字体大小:正常;字体风格:普通;字体大小:16.00pt可选(字体系列:“Helvetica Neue”;字体重量:粗体;字体样式:普通;字体大小:16.00pt)此外,anyobject不是类型,而是可以表示任何类类型实例的协议。如果您知道C/C++,那么在C中,如果持有任何指针,它就相当于空隙*,这里只不过是它持有任何对象。对于这个问题,您将面临W.R.T文本大小被切断,您能用“更新”部分更新您的问题并向我们展示您正在使用的新代码吗?是的,它确实解决了问题。在这里,类型转换不重要,事实上,如果您尝试UIFont(名称:“HelveticaNeue Bold”,大小:16)as!UIFont,它应该仍然有效。最重要的是不要选择期权。做得好,您的解决方案看起来更优雅。