1

SplitFrameViewControllerに似たものを作成していますが、カスタム実装を作成するのに十分な違いがあります。「マスター」ビューのサイズを使用可能な画面の25%にし、「詳細」ビューのサイズを残りの75%にしようとすると、問題が発生します。

何を試してもサイズがおかしいです。MasterViewの幅が広すぎて、詳細が少し重なっています。ペン先ファイルで何か間違ったことをしているのではないかと思いますが、よくわかりません。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}}
4

2 に答える 2

2

おやおや、私はそれを理解しました。そのため、アプリケーションは横向きでのみ実行しています。しかし、私はポートレートモードでフレーム測定値を取得していました。どうやら、それが起動し、実行され、ランドスケープモードをサポートするだけであっても、最初にポートレートモードでビューを作成し、次にランドスケープモードに切り替えます。ViewWillAppearは、切り替え前に実行されていました(私が読んだすべての内容では、後で実行することになっていますが)。ViewWillAppearブロック内のコードをに移動しましたが、(void)viewWillLayoutSubviews正常に機能しました。

問題が発生した可能性があるもう1つの理由は、技術的にはRootViewControllerのviewプロパティが存在してはならないということですが、クラスの外部ではなく、クラス内から値を返していました。正直なところ、一般的には奇妙な振る舞いです。とにかく、誰か他の人がこの問題を抱えているなら、それが答えです。

于 2012-06-28T18:59:22.433 に答える
0

この猫の皮を剥ぐもう1つの方法は、ビューの幅/高さを次のように設定することです。

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

位置が強打であることが判明した場合は、好きになるまで数字で遊ぶことができます。あなたがやろうとしているようにその場で境界を計算するほどエレガントではありませんが、より単純でバグが少ないかもしれません。幸運を!

于 2012-06-27T20:59:11.013 に答える