0

こんにちは仲間のプログラマー、

まず、長い投稿でごめんなさい。私の質問はかなり単純ですが、私が何をしているのかをあなたに知ってもらいたいので、私のアプローチの基本的な考え方を変えたくはありません。

(以下はすべてプログラムで行われ、ストーリーボード、ペン先、ナビゲーションコントローラーはありません)

独自のビューのないRootViewControllerがあります。彼が行うのは、他のViewControllerをインスタンス化し、それらの遷移を管理し、それらのビューをメインウィンドウにプッシュ(追加)することだけです。これらのビューを正しく配置するために、RootViewCOntrollersサブコントローラーの1つの境界/フレームを取得したいと思います。これは、appDelegateからRootViewControllerを作成する方法です(空のプロジェクトから始めました)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor grayColor];
    self.window.rootViewController = [[UCRootViewController alloc]init];
    [self.window makeKeyAndVisible];
    return YES;
}

彼の初期化後、rootviewControllerはMapViewControllerを作成します

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"RootviewController initialized");
    self.mapviewController = [[UCMapviewController alloc] initWithDelegate:self];
    self.view = self.mapviewController.view;
    [self.mapviewController.view setOpaque:YES];
    [self.view bringSubviewToFront:self.mapviewController.view];
    [self presentModalViewController:self.mapviewController animated:YES];
    self.currentlyActiveController = self.mapviewController;
}

MapViewControllerは、navigationBarとMKMapViewを作成します。MapViewControllerのウィンドウの境界/フレームを取得できないため、現在、フレームをハードコーディングして設定しています。viewDidLoad()境界/フレームに関する情報を取得しようとすると、0が返されます。

- (void)viewDidLoad
{
    NSLog(@"MapviewController initialized");
    [super viewDidLoad];

    self.isMapViewPushedAside = NO;
    // Custom initizialation for navigationBar
    [self setupNavigationBar];

    // Custom initialization for mapview
    [self setUpMapview];
    [self trackUserLocation];

    // Custom initialization for popupActionsButton
    [self setUpPopupButtons];

    // Custom tests
    [self test];

    [self focusLocationOnMap:self.locationManager.location.coordinate];
    [self.locationManager stopUpdatingLocation];
}

ウィンドウのフレーム/境界(同じ)を返す2つのデリゲートメソッドを実装しました。問題は、すべてが初期化された後ではなく、最初にこれらの値を取得する必要があることです。すべてが起動した後でボタンからデリゲートメソッドを呼び出すと、期待どおりに機能します。

CGRect frame = [self.mapDelegate frameData];
NSLog(@"width by frame: %f", frame.size.width);
NSLog(@"height by frame: %f", frame.size.height);

CGRect bounds = [self.mapDelegate boundsData];
NSLog(@"width by bounds: %f", bounds.size.width);
NSLog(@"height by bounds: %f", bounds.size.height);

開始時、つまりカスタムの「セットアップ」メソッドを呼び出す前に、フレーム/境界を取得するにはどうすればよいですか。

4

1 に答える 1

4

独自のビューのないRootViewControllerがあります。

ビューなしでUIViewControllerを使用することはできません。あなたが持っている場合、アプリはクラッシュします。UIViewControllerを初期化すると、UIViewが自動的に作成されます。

- (void)viewDidLoad
{
    [super viewDidLoad];
    ..
    self.mapviewController = [[UCMapviewController alloc] initWithDelegate:self];
    self.view = self.mapviewController.view;
    ..
}

ここで確認できることから、実際にはRootviewControllerのビューをマップビューに設定しています。これは、コントローラーのメソッドをオーバーライドすることによって-(void)loadView実行する必要があり、そこでビューを設定する必要があります。

-(void)loadView
{
    self.mapviewController = [[UCMapviewController alloc] initWithDelegate:self]; //if you're not using ARC this should be autoreleased;
    self.view = self.mapviewController.view;
}

viewDidLoadメソッドが呼び出されると、コントローラーのどのビューにもジオメトリが設定されません。それらは(暗黙的または明示的に-(void)loadView)初期化さviewDidLoadれるだけで、その直後に呼び出されます。ジオメトリは、viewWillAppear:メソッドと連続viewDidAppear:メソッドで最も早くセットアップされるためviewWillAppear:、ビューの実際のフレーム/境界を設定できる最も早いポイントであり、viewWillAppear:メソッドでは、いくつかの軽量操作(ジオメトリの設定、タイマーの開始、オブザーバーのサブスクライブなど)のみを実行する必要があります。 ..)。
アプローチを変えたくないとおっしゃいましたが、これらのルールに従って設計する必要があります。

于 2012-05-10T05:58:32.003 に答える