UITextView sizeToFit 不起作用
Posted
技术标签:
【中文标题】UITextView sizeToFit 不起作用【英文标题】:UITextView sizeToFit not working 【发布时间】:2014-01-08 14:11:31 【问题描述】:奇怪的是,我一直在到处寻找这个答案,但似乎没有任何效果!
我有一个简单的UITextView
,我正在尝试根据其内容在 viewController 中调整大小:
- (void)viewDidLoad
[super viewDidLoad];
NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.";
self.textView.text = lorum;
self.textView.scrollEnabled = NO;
[self.textView sizeToFit];
[self.textView layoutIfNeeded];
但这就是我最终的结果:
我是否遗漏了一些明显的东西?
已更新(框架背景):
【问题讨论】:
Weird thing occurs when using sizetofit of a UITextView in ios7 的可能重复项 不是重复的......这是一个不同的问题 @Jeremy 请删除重复的标签...那是说文本已被截断。我的意思是框架没有适应多行文本。 为您的文本视图设置背景颜色并查看框架的显示位置。 self.textView.backgroundColor = [UIColor grayColor];有图片! 【参考方案1】:正如我在评论中所写,在我看来,如果你不想使用 UITextView 的滚动,我建议使用简单的 UILabel .. 这是代码:
编辑:如果您出于某种原因(例如可编辑文本或可选择文本)使用 UITextView,您可以使用相同的代码并进行一些修改(我在 cmets 等代码中添加此修改)
EDIT2如果您的标签在情节提要中检查约束或删除自动布局
.h
@interface ViewController : UIViewController
IBOutlet UILabel *label;
.m
- (void)viewDidLoad
[super viewDidLoad];
// UILabel *label = [[UILabel alloc] init];
label.backgroundColor = [UIColor lightGrayColor];
NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.";
//for use labrect with UITextView you set the font of UITextView:
//label.font = [UIFont systemFontOfSize:17];
CGSize maxSize = CGSizeMake(320, 410);
CGRect labrect = [lorum boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@NSFontAttributeName:label.font context:Nil];
label.text = lorum;
//for use UITextView you should comment the line under
label.numberOfLines = 0;
label.frame = CGRectMake(0, 30, 320, labrect.size.height);
// [self.view addSubview:label];
;
【讨论】:
是否可以修改视图中已有的现有 uilabel? @Allen 是的,有可能......如果你想使用 UITextView,我编辑了我的代码 谢谢,但是否可以对已经存在的 uilabel 执行此操作?这意味着我已经在我的 xib/storyboard 中有它,而且我不调用 [self.view addSubview:label]; @Allen 是的,只需删除该行和 label = [[UILabel alloc] init] ,然后更改其框架 是的,这是我尝试过的,但它不起作用。对你有用吗?【参考方案2】:https://medium.com/ios-os-x-development/102e73853fbc
看看这个解决方案。它对我有用!
您所要做的就是在情节提要上添加一个高度限制,并在您的视图控制器中使用插座。然后将以下行添加到 viewDidAppear 方法中:
CGSize 大小 = self.textView.contentSize; self.textViewHeightConstraint.constant = size.height;
如果你点击链接,会有一个示例项目。
【讨论】:
有人能解释一下为什么这在 viewdidappear 中有效,但在 viewdidlayoutsubviews 中无效吗? 我认为这是最好的解决方案,很容易理解为什么 sizeToFit 对 Textview 不起作用,因为里面的 textview 是一个滚动视图。所以我们需要为 sizeToFit 更新约束高度。 @Spoek:此解决方案适用于 viewdidappear 或 viewdidlayoutsubviews。我刚刚检查过了。【参考方案3】:您尝试过使用UIViewContentMode 吗?
例如:
[self.textView setContentMode:UIViewContentModeScaleToFill];
【讨论】:
@Allen 你否决了我的建议?也许糟糕的一天?提醒我不要再提供任何建议??? 抱歉不是针对个人的!只是想让工作答案浮到顶部 是的,了解@Allen,但对于像我这样的新人来说,无论我们的能力或热情如何,它都会对我们更多地参与这个论坛的能力产生非常实际的影响。让工作答案浮到顶部的更有效方法是让用户对其进行投票。仅供参考:我想到的下一个建议实际上与对您有帮助的答案有关,并且是指向一个非常好的关于堆栈溢出的问答的链接,我已将其添加为收藏...Vertically align text within a UILabel。【参考方案4】:尝试手动调整帧大小。
self.textView.text = lorum;
CGSize size = [lorum sizeWithFont:self.textView.font
constrainedToSize:CGSizeMake(self.textView.frame.size.width, 9999)
lineBreakMode:UILineBreakModeWordWrap];
CGRect frame = self.textView.frame;
frame.size.width = size.width;
frame.size.height = size.height;
self.textView.frame = frame;
这应该将您的 textview 的大小设置为文本的大小(限制为 textView 的宽度)。原点应该保持不变。
据我所知sizeToFit
只会缩小框架,不会扩大框架。因此,如果您的框架最初只有一条线高,它将保持只有一条线高。
或者,您可以将 textView 的框架设置为整个窗口,然后使用 sizeToFit,这样应该可以正常工作。
编辑:
为了避免不推荐使用的功能,您还可以使用
CGSize size = [lorum sizeWithAttributes:@NSFontAttributeName:self.textView.font];
或
CGRect rect = [text boundingRectWithSize:(CGSize) .width = self.textView.frame.size.width, .height = CGFLOAT_MAX options:NSStringDrawingUsesLineFragmentOrigin attributes:@ NSFontAttributeName = self.textView.font context:nil];
【讨论】:
不起作用,方法 sizeWithFont... 在 iOS7 中已弃用 然后使用[lorum sizeWithAttributes:@NSFontAttributeName:self.textView.font];
或[text boundingRectWithSize:(CGSize) .width = self.textView.frame.size.width, .height = CGFLOAT_MAX options:NSStringDrawingUsesLineFragmentOrigin attributes:@ NSFontAttributeName = self.textView.font context:nil];
在 textView 上找不到属性大小 (self.textView.size = size;)。 frame.size 不可分配
用更多选项和固定错别字更新答案。
展示你尝试过但没有奏效的东西通常很有用,这样其他人就不会给你一个你已经知道不适合你的情况的答案。以上是关于UITextView sizeToFit 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥在尝试垂直对齐我的 UILabel 时 sizeToFit 不起作用?它只是停留在中心
UITableViewCell`sizeToFit`中的UILabel在AutoLayout的单元格内不起作用
label同时设置sizeToFit,NSTextAlignmentCenter不起作用