如何控制子视图的大小和布局?

Posted

技术标签:

【中文标题】如何控制子视图的大小和布局?【英文标题】:How do I control the size and layout of child views? 【发布时间】:2012-10-09 18:23:44 【问题描述】:

我正在深入研究 ios 开发,并试图弄清楚如何控制多个子视图(在本例中为两个子视图)的大小和布局。我在不同的上下文中发布了这个问题,但我的问题没有得到回答,所以我将它作为一个更简单的问题重新发布。我试图添加到子视图并将它们分别放置在 (0, 0) 和 (100, 100) 处,但是我添加的第一个视图(主视图)最终填满了整个屏幕。我的代码很简单,我做错了什么导致我无法控制两个子视图的大小和位置?

MySplitViewController.m

#import "MySplitViewController.h"
#import "MasterViewController.h"
#import "DetailViewController.h"

@interface MYSplitViewController ()

@property (nonatomic, strong) MasterViewController *masterViewController;
@property (nonatomic, strong) DetailViewController *detailViewController;

@end

@implementation MySplitViewController

- (id)initWithCoder:(NSCoder *)aDecoder
    self = [super initWithCoder:aDecoder];
    if (self) 
      self.masterViewController = [[MasterViewController alloc] initWithNibName:nil bundle:nil];
      self.detailViewController = [[DetailViewController alloc] initWithNibName:nil bundle:nil];
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    self.view.frame = CGRectMake(0, 0, 768, 1004);
    [self.view addSubview:self.masterViewController.view];
    [self.masterViewController viewDidLoad];
    [self.view addSubview:self.detailViewController.view];
    [self.detailViewController viewDidLoad];


@end

MasterViewController.m

#import "MasterViewController.h"

@interface MasterViewController ()

@end

@implementation MasterViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
    
    return self;


- (void)viewDidLoad 
    [super viewDidLoad];
    UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 100, 1004) style:UITableViewStylePlain];
    table.dataSource = self;
    table.delegate = self;
    [self.view addSubview:table];


@end

DetailViewController.m

#import "DetailViewController.h"

@interface DetailViewController ()

@end

@implementation DetailViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
    
    return self;


- (void)viewDidLoad 
    [super viewDidLoad];
    UIView *uiview = [[UIView alloc] initWithFrame:CGRectMake(100, 0, 668, 1004)];
    [self.view addSubview:uiview];


@end

非常感谢您的智慧!

【问题讨论】:

【参考方案1】:

尝试设置 self.masterViewController.viewself.detailViewController.view 的框架,然后将其作为子视图添加到 self.view

例如:-

self.masterViewController.view.frame = CGRectMake(0, 0, 100, 100);
self.detailViewController.view.frame = CGRectMake(100, 100, 200, 200);

而且你不应该直接调用viewDidLoad 方法。一旦视图加载到屏幕上,它就会自动调用。

【讨论】:

当你添加一个视图作为另一个视图的子视图时,你需要设置框架,否则它将采用默认框架。因此,在您的情况下,它正在全屏显示。从上面的代码可以清楚地看出,你只为'table'和'uiview'设置了框架,它们只是'self.masterViewController.view'和'self.detailViewController.view'的子视图,与这两个视图不同。跨度> 【参考方案2】:

您应该为您的 MySplitViewController 视图创建 UIView 派生类并实现 layoutSubviews 方法

【讨论】:

以上是关于如何控制子视图的大小和布局?的主要内容,如果未能解决你的问题,请参考以下文章

(自动布局)容器视图调整大小但子视图不

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

如何使用自动布局调整视图大小以适合标签子视图?

只想使用自动布局调整中间视图的大小

如何在具有自动布局的容器视图中将 UITableView 的大小设置为子视图

调整子视图大小的自动布局问题