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
。
似乎我无法仅通过使用autoresizingMask
和autoresizesSubviews
的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` 应该没问题,但是如果你以错误的顺序使用autorelease
和init
,NSString
s 和其他类簇会泄漏。不过,很抱歉无法帮助您解决真正的问题。
谢谢 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:自动调整大小以填充视图 - 显式帧大小是必不可少的吗?的主要内容,如果未能解决你的问题,请参考以下文章