调整容器视图控制器内的视图大小

时间:2012-06-27 19:56:10

标签: ios xcode ios5 uiviewcontroller

我正在创建类似于SplitFrameViewController的东西,但有足够的差异,我正在进行自定义实现。当我试图将“主视图”视图调整为可用屏幕的25%并将“详细信息”视图设置为剩余的75%时,我的问题就出现了。

无论我尝试什么,但尺寸不正确。 MasterView太宽,细节重叠了一点。我想我可能在我的nib文件中做了一些不正确的事情,但我不太确定。 iPad模拟器上的结果大小对于主视图大约为35%,对于详细视图大约为80%。

此外,如果有人对我的项目结构有任何批评/意见/建议,也可以对此发表评论,因为这是我的第一次尝试。

的AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.containerViewController = [[ContainerViewController alloc] init];
    self.window.rootViewController = self.containerViewController;

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    return YES;
}

ContainerViewController

我已经检查了viewWillAppear中生成的矩形的宽度,它们是正确的。

- (id)init
{
    self = [super init];
    if (self) {
        self.masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
        self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [self addChildViewController:self.masterViewController];
        [self addChildViewController:self.detailViewController];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view addSubview:self.masterViewController.view];
    [self.masterViewController didMoveToParentViewController:self];
    [self.view addSubview:self.detailViewController.view];
    [self.detailViewController didMoveToParentViewController:self];
}

- (void)viewDidUnload
{
    self.masterViewController = nil;
    self.detailViewController = nil;
    [super viewDidUnload];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGRect containerBounds = self.view.bounds;
    CGRect masterBounds, detailBounds;
    CGRectDivide(containerBounds, &masterBounds, &detailBounds, CGRectGetWidth(containerBounds) * 0.25, CGRectMinXEdge);

    self.masterViewController.view.frame = masterBounds;
    self.detailViewController.view.frame = detailBounds;
}

修改

我在viewWillAppear的末尾添加了以下行,并得到了评论结果。

NSLog(@"container bounds: %@", NSStringFromCGRect(containerBounds));
NSLog(@"master bounds: %@", NSStringFromCGRect(masterBounds));
NSLog(@"detail bounds: %@", NSStringFromCGRect(detailBounds));

// container bounds: {{0, 0}, {768, 1004}}
// master bounds: {{0, 0}, {192, 1004}}
// detail bounds: {{0, 0}, {576, 1004}}

2 个答案:

答案 0 :(得分:2)

哦,天哪,我明白了。所以我只在横向方向上运行我的应用程序。但是我在纵向模式下进行了帧测量。显然,即使它只启动,运行和支持横向模式,它首先以纵向模式创建视图,然后切换到横向模式。 ViewWillAppear在切换之前就已经运行了(即使我读过的所有内容都说它应该继续)。我将ViewWillAppear块中的代码移动到(void)viewWillLayoutSubviews,它运行正常。

可能存在问题的另一个原因是技术上我的RootViewController的view属性不应该存在,尽管它是从类中返回值,而不是在它之外。老实说,这只是奇怪的行为。无论如何,如果其他人有这个问题,那就是答案。

答案 1 :(得分:0)

另一种修饰此猫的方法是简单地设置视图的宽度/高度,如下所示:

if (orientation == UIDeviceOrientationPortrait) {
    self.masterViewController.view.frame = CGRectMake(0,0,192,1004);
    self.detailViewController.view.frame = CGRectMake(0,0,576,1004);
} else {
   [...]
}

如果事实证明这个位置很糟糕,你可以玩这些数字,直到你喜欢它们为止。不像你想要的那样在飞行中计算边界那么优雅,但可能更简单,更少的马车。祝你好运!