- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
所以我在 IB 中设置了我的 View ,以便此文本标签通过约束与缩略图的顶部对齐。
然而,正如我们所知,您不能垂直对齐 UILabel 中的文本。我的文本根据内容的长度更新字体大小。全尺寸文本看起来很棒,而小文本在 View 中明显较低。
existing solution涉及调用 sizeToFit 或更新 uilabel 的框架以匹配文本的高度。不幸的是,后一种(虽然丑陋)解决方案不能很好地处理您不应该更新框架的约束。当您需要让文本自动收缩直到截断时,前一种解决方案基本上不起作用。 (因此它不适用于有限数量的行和自动收缩)。
现在,为什么 uilabel 的固有大小(高度)不会像宽度那样更新,当它通过“大小以适合内容”设置为自然大小时,我无法理解。看起来它绝对应该,但事实并非如此。
所以我只能寻找替代解决方案。据我所知,您可能必须在标签上设置高度约束,并在计算文本高度后调整高度常数。谁有好的解决办法?
最佳答案
这个问题是真正需要解决的 PITA。有效的 API 在 iOS7 中被弃用,或者 iOS7 替换 API 被破坏,这都无济于事。废话!
您的解决方案很好,但是它使用了一个已弃用的 API (sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
),并且它没有很好地封装 - 您需要将此代码复制到任何您想要此行为的单元格或 View 。从好的方面来说,它相当有效!一个错误可能是您在计算时标签尚未布局,但您根据其宽度进行计算。
我建议您将此行为封装在 UILabel 子类中。通过将大小计算置于覆盖的 intrinsicContentSize
方法中,标签将自动调整自身大小。我编写了以下代码,其中包含将在 iOS6 上执行的代码,以及我使用 iOS7 或更高版本的未弃用 API 的版本:
@implementation TSAutoHeightLabel
- (CGSize) intrinsicContentSize
{
NSAssert( self.baselineAdjustment == UIBaselineAdjustmentAlignCenters, @"Please ensure you are using UIBaselineAdjustmentAlignCenters!" );
NSAssert( self.numberOfLines == 1, @"This is only for single-line labels!" );
CGSize intrinsicContentSize;
if ( [self.text respondsToSelector: @selector( boundingRectWithSize:options:attributes:context: )] )
{
NSStringDrawingContext* context = [NSStringDrawingContext new];
context.minimumScaleFactor = self.minimumScaleFactor;
CGSize inaccurateSize = [self.text boundingRectWithSize: CGSizeMake( self.bounds.size.width, CGFLOAT_MAX )
options: NSStringDrawingUsesLineFragmentOrigin
attributes: @{ NSFontAttributeName : self.font }
context: context].size;
CGSize accurateSize = [self.text sizeWithAttributes: @{ NSFontAttributeName : [UIFont fontWithName: self.font.fontName size: 12.0] } ];
CGFloat accurateHeight = accurateSize.height * inaccurateSize.width / accurateSize.width;
intrinsicContentSize = CGSizeMake( inaccurateSize.width, accurateHeight);
}
else
{
CGFloat actualFontSize;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
[self.text sizeWithFont: self.font
minFontSize: self.minimumFontSize
actualFontSize: &actualFontSize
forWidth: self.frame.size.width
lineBreakMode: NSLineBreakByTruncatingTail];
#pragma GCC diagnostic pop
CGRect lineBox = CTFontGetBoundingBox((__bridge CTFontRef)([UIFont fontWithName: self.font.fontName size: actualFontSize]));
intrinsicContentSize = lineBox.size;
}
return intrinsicContentSize;
}
@end
这个实现并不完美。我必须确保使用 baselineAdjustment == UIBaselineAdjustmentAlignCenters,但我不能 100% 确定我理解原因。而且我对为获得准确的文本高度而必须跳过的箍不满意。我的计算结果与您的计算结果之间也存在一些像素差异。随意使用它并根据需要进行调整:)
boundingRectWithSize:options:attributes:context
API 对我来说似乎很糟糕。虽然它(主要是!)正确地将文本限制为输入大小,但它没有计算出正确的高度!它返回的高度基于提供的字体的行高,即使正在缩放也是如此。我猜这就是为什么 UILabel
默认没有这种行为?我的解决方法是计算高度和宽度都准确的无约束尺寸,然后使用受约束和无约束宽度之间的比率来计算受约束尺寸的准确高度。什么皮塔饼。在 Apple 开发者论坛和 SO 上有很多提示指出这个 API 有很多这样的问题。
关于ios - 垂直对齐带有约束的 UILabel 文本且不换行(自动布局,单行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510875/
我想对齐输入,它有两个标签和一个没有任何标签的按钮,以便它们都在同一级别。 这是期望的效果: 这是我到目前为止得到的: 我通过在按钮前添加带有空白空间的标签,设法让它看起来像我想要的样子,但这并不理想
您好,我有一个关于 JavaFX 的问题。我担心答案是剥皮,我对此一无所知,但这里是。 我想在 JavaFX 中制作 Accordion/TabPane 交叉。我将尝试用文字解释自己,但在下面我已经包
这可能被认为是一个低俗的问题。然而,我还没有找到任何代码,也没有找到任何讨论如何用我的编程语言 C 来解决这个问题的论坛。已经进行了大量的尝试,并且最终都以实际上“硬编码”新数组而告终。 我正在尝试垂
我有以下代码: public Frame() { super(); setVisible(true); setDefaultCloseOperation(JFrame.EXIT
是否可以将 UIModalTransitionStyleFlipHorizontal 修改为垂直而不是水平? 我通常会使用 CATransition 来执行此操作,但该方法需要将一个 UIView
我有一个 ios5 导航的想法,我正在一个应用程序上做,我认为从 SOF 那里得到一些关于我的想法的建设性批评是明智的。 p> 想法: UIView 包含 6 个左右垂直堆叠的按钮 UIButtons
我正在努力进行一些 iOS 开发,我希望有人能够帮助我提出建议。我想实现一堆看起来像一副纸牌的 UIView。用户应该能够通过触摸刷出“卡片”。我想到了带有 pagingEnabled 的 UIScr
我想创建一个包含四张图片的入口页面作为指向其他页面的链接。但我希望这些图片显示在显示器的中间(垂直和水平)。我已经尝试了很多事情,但我做对了。我什至无法以任何方式垂直对齐图片(例如底部,您将在代码中看
我有代码在 div 的底部创建一个元素作为向下的“箭头/指针”。 我需要这样写,以便“箭头/指针”指向左侧 当前代码 - HTML 掩码 css 在 fiddle 中 https://j
下面的代码将焦点放在中间的 div 上,但该 div 出现在窗口的底部。如何使该 div 居中,使其显示在窗口的中心[垂直],而不设置固定位置。 $(function(){ $("#focus
这个问题在这里已经有了答案: Vertical Align Center in Bootstrap 4 [duplicate] (20 个答案) 关闭 4 年前。 我创建了一个由两列组成的结构,第一
演示:http://jsfiddle.net/vpH8r/2/ 我在上面创建了一个 jfiddle,试图让垂直滑动正常工作。 当前的问题是 slider 标签不会移动,并且不会出现从顶部到底部的干净滑
我正在尝试在 javascript 中创建一个垂直 slider 小部件。我不是在寻找任何插件或库,我正在尝试查看如何使用纯 javascript 完成它。我想我大概明白了。 请在此处查看到目前为止已
我正在尝试创建一个响应式导航列表,并将图像置于页面列表的中心 我已经设法接近那个,但是图像比列表更靠前。 我想像这样得到它,但似乎无法弄清楚。 任何帮助将不胜感激! 代码:https://jsfidd
有人可以帮我将导航栏居中,使其在页面上垂直居中吗? 我希望导航栏中央的链接位于顶部,而不是像现在这样向左浮动。 提前致谢 Toggle navigation
我想垂直、水平转换图像,并使用 javascript 缩放图像。目前我设法使调整大小的图像起作用,但它看起来不正确。我正在尝试使用类似于 Transform image 的东西.调整垂直移动条时,图像
这可能是一个问题,但要求太多,但我已经达到了我的极限。 我有这段 ( http://jsfiddle.net/3whTa/) CSS,它创建了一个箭头水平面包屑导航。 我想做的是将其转换为垂直。就像箭
我正在使用 opencv 进行非常简单的操作,但我无法理解为什么会出现此错误/问题。图像被操作到图像的一半(垂直)。 Mat img = imread("/Users/tanmoy/Documents
我想知道是否有人有任何技术来定位 css 生成的内容。例如: .block { height: 150px; width: 150px; border: 1px solid black;
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭3年前。 Improve this que
我是一名优秀的程序员,十分优秀!