English 中文(简体)
我该如何让-[NSString sizeWithFont:forWidth:lineBreakMode:]起作用?
原标题:
  • 时间:2009-01-07 04:46:17
  •  标签:

我更新了我的问题“如何在 iPhone SDK 中调整 UILabel 的大小以适应文本?”,描述了我的问题和一个建议的解决方案,但没有得到答案。也许通过提出新问题会有更好的结果...

我在以下代码后设置了断点:

NSString *theText = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature s God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.";
CGSize theSize = [theText sizeWithFont:[UIFont systemFontOfSize:17.0f] forWidth:260.0 lineBreakMode:UILineBreakModeWordWrap];

theSize.height 是21,theSize.width 是231。我做错了什么?那个高度不能是像素也不能是行数。

请注意,[UIFont systemFontOfSize:17.0f] 用于指定默认字体。

更新:我更改了代码为:

CGSize constraintSize;
constraintSize.width = 260.0f;
constraintSize.height = MAXFLOAT;
NSString *theText = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature s God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.";
CGSize theSize = [theText sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

theSize.height 是 273。看起来更正常了。

最佳回答

那个高度是以像素为单位。我预计它正在截断,即为您提供设置此文本在具有1行的UILabel上所看到的度量标准。

尝试使用sizeWithFont:constrainedToSize:,并将其高度大小组件设置为MAXFLOAT

问题回答

正如任何已經解決這個問題的人所了解的那樣,該方法的命名不合適,並且與您期望的相當不一致(這是一個違反良好 API 設計的行為,但是任何經驗豐富的開發人員都知道:蘋果的 API 設計不良,對不起,傢伙們)。 值得閱讀:Josh Bloch 的演講 談良好 API 設計。

我认为他们应该重新命名它(如果必须保留),并使其有用,这样你就不会使用通常的做法来传递一个你知道尺寸太大的CGSize

[someString sizeWithFont:yourFont 
       constrainedToSize:CGSizeMake(maxWidthYouSpecify, self.frame.size.height)  
           lineBreakMode:UILineBreakModeWordWrap];

另外,这也能一样好地起作用:

[someString sizeWithFont:yourFont 
       constrainedToSize:CGSizeMake(maxWidthYouSpecify, CGFLOAT_MAX)
           lineBreakMode:UILineBreakModeWordWrap];

这可以说是该函数应该如何运作。(顺带一提,CGFLOAT_MAXCGGeometry中有定义)

一个重要的提示:所有的Core Graphics处理都是以点而非像素为单位。

一个点不一定对应屏幕上的一个像素。

这是一个重要的区别,你需要在处理不同的分辨率(iPhone 3GS vs 4 vs iPad等)时理解。请参阅Apple的文档和Command+F的“Points vs Pixels”。





相关问题
热门标签