确定viewDidLoad中的帧/边界

时间:2012-05-10 05:19:53

标签: ios cocoa-touch uikit

Hello其他程序员,

首先,抱歉这篇长篇文章。我的问题很简单,但我想确保你知道我在做什么,而且我真的不想改变我的方法的基本思路。

(以下是以编程方式完成的,没有故事板,没有笔尖,没有导航控制器)

我有一个没有自己视图的RootViewController。他所做的就是实例化其他ViewControllers,管理它们的转换并将它们的视图推送(添加)到主窗口中。要正确定位这些视图,我想获得一个RootViewCOntrollers SubControllers的边界/框架。这是我从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];
}

我已经实现了两个委托方法,它们为窗口返回frame / bounds(相同)。问题是,我必须在开始时获取这些值,而不是在所有内容都已初始化之后。当我在一切都结束后从按钮调用委托方法时,它们按预期工作。

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);

如何在开始时获取帧/边界,即在调用我的自定义“设置”方法之前..?

1 个答案:

答案 0 :(得分: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:方法你应该只执行一些轻量级的操作(比如设置几何,启动计时器,订阅观察者等等。) 你说你不想改变你的方法,但你需要根据这些规则进行设计。