xcode/iOS:自动调整大小以填充视图 - 显式帧大小是必不可少的吗?

Posted

技术标签:

【中文标题】xcode/iOS:自动调整大小以填充视图 - 显式帧大小是必不可少的吗?【英文标题】:xcode/iOS: Autoresize to fill a view - explicit frame size is essential? 【发布时间】:2011-06-22 16:34:38 【问题描述】:

我想要一个UITextView 来填充它的superView,这是UIViewController 实例中的一个普通UIView

似乎我无法仅通过使用autoresizingMaskautoresizesSubviews 的API 指定属性来使UITextView 做到这一点。如此处所示设置这些没有任何作用;尽管superView 填满了屏幕,UITextView 仍然很小。

// use existing instantiated view inside view controller;
// ensure autosizing enabled
self.view.autoresizesSubviews = YES;
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight|
                             UIViewAutoresizingFlexibleWidth;
// create textview
textView = [[[UITextView alloc] autorelease] initWithFrame:CGRectMake(0, 0, 1, 1)];
// enable textview autoresizing
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
// add textview to view
[self.view addSubview:textView];

但是,如果我在视图控制器中实例化我自己的视图,替换它的 '.view' 属性,那么一切都会按预期工作,并且 textView 会填充它的父视图:

// reinstantiate view inside view controller
self.view = [[UIView alloc]init];
// create textview
textView = [[[UITextView alloc] autorelease] initWithFrame:CGRectMake(0, 0, 1, 1)];
// enable textview autoresizing
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
// add textview to view
[self.view addSubview:textView];

我已经尝试了所有这些初始化程序/方法中的两个代码块,并且在每种情况下都会出现相同的情况:

-(id)init;
-(id)initWithFrame:(CGRect)frame;
-(void)viewDidLoad;

我意识到重新实例化 UIViewController 的 '.view' 很糟糕,谁能解释我做错了什么?我想我可以通过在我的UIViewController 中使用初始框架设置代码来调整UITextView 的大小一次,然后autoresizing 将按照需要运行。

-(void)viewDidLoad 
    textView.frame = self.view.frame;

...但是在这个阶段似乎没有设置 view.frame,它没有定义它的 '.size' 值,所以 textView 再次保持很小。

实现我想要的正确方法是什么?我必须通过UITextView:initWithFrame 明确指定全屏尺寸以使其填充其超级视图吗?

如果您能提供任何建议,我将不胜感激。

【问题讨论】:

不要在init 之前autorelease。正确的顺序是 ` ... alloc] init] autorelease]. UIView` 应该没问题,但是如果你以错误的顺序使用autoreleaseinitNSStrings 和其他类簇会泄漏。不过,很抱歉无法帮助您解决真正的问题。 谢谢 Yuji,我很感激这个提示 - 我不知道的事情! 【参考方案1】:

自动调整大小并不意味着子视图将占用其父视图的大小。这只是意味着每当超级视图的边界发生变化时,它将相对于其超级视图的大小变化来调整大小。因此,最初,您必须将子视图的大小设置为正确的值。自动调整大小的掩码将在未来处理大小变化。

这就是你所需要的:

textView = [[[UITextView alloc] autorelease] initWithFrame:self.view.bounds];
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];

【讨论】:

我把它放到 loadView 中(确保首先调用 [super loadView]),它很好地完成了这项工作 :) 非常感谢,Ole 对于 Swift,它看起来像这样:var textView = UITextView(frame: self.view.bounds) textView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight 对于 Swift 2,请使用:textView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]【参考方案2】:

这里 Swift 3 解决方案:

myView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

【讨论】:

以上是关于xcode/iOS:自动调整大小以填充视图 - 显式帧大小是必不可少的吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据内容自动调整卡片视图的大小

iOS - 调整视图层大小以填充 iPhone X Max 背景

textView自动调整文本以填充宽度

使用自动布局扩展方形视图以填充矩形超级视图

自动调整大小的动态文本以填充固定大小的容器

如何设置数据网格列以填充数据网格集以填充和布局自动调整大小的网格?