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);
如何在开始时获取帧/边界,即在调用我的自定义“设置”方法之前..?
答案 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:
方法你应该只执行一些轻量级的操作(比如设置几何,启动计时器,订阅观察者等等。)
你说你不想改变你的方法,但你需要根据这些规则进行设计。