2012-05-10 5 views
0

안녕하세요 동료 프로그래머viewDidLoad에서 프레임/경계를 결정하십시오.

먼저 긴 게시물을 유감스럽게 생각합니다. 내 질문은 다소 단순하지만, 내가하고있는 일을 알고 있는지 확인하고 싶습니다. 제 접근 방식의 기본 아이디어를 바꾸고 싶지는 않습니다.

이 (다음 모든 프로그램 수행, 더 스토리 보드, 아니 펜촉, 아니있는 navigationController)

는 나는 자신도없는 RootViewController이 없습니다. 그가하는 일은 다른 ViewController를 인스턴스화하고, 전환을 관리하고, 자신의 뷰를 메인 윈도우에 푸시 (추가)하는 것뿐입니다. 이러한 뷰를 올바르게 배치하기 위해 RootViewCOntrollers SubController 중 하나에 대한 경계/프레임을 가져 오려고합니다. 내가 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는 내비게이션 바 및 MKMapView를 생성하는 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의 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]; 
} 

프레임에 대해 프레임/경계 (동일한)를 반환하는 두 개의 대리자 메서드를 구현했습니다. 문제는 모든 것을 초기화 한 후에가 아니라 처음부터 그 값을 얻어야한다는 것입니다. 모든 것이 끝난 후 버튼에서 대리자 메서드를 호출하면 예상대로 작동합니다.

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

고유 한보기가없는 RootViewController가 있습니다.

보기없이 UIViewController를 가질 수 없습니다. 만약 당신이 응용 프로그램이 충돌합니다. UIViewController를 초기화하면 UIView가 자동으로 생성됩니다.

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

여기서 볼 수있는 것은 실제로 RootviewController의보기를지도보기로 설정하는 것입니다. 이 컨트롤러의 -(void)loadView 방법을 재정 의하여 수행해야하고 거기 당신은보기 설정해야합니다

viewDidLoad 방법이있다라고
-(void)loadView 
{ 
    self.mapviewController = [[UCMapviewController alloc] initWithDelegate:self]; //if you're not using ARC this should be autoreleased; 
    self.view = self.mapviewController.view; 
} 

는 컨트롤러의 뷰의 설정에는 기하학 없습니다입니다. 그들은 단지 (-(void)loadView에 의해 암시 적으로 또는 명시 적으로) 초기화되고 바로 다음에 viewDidLoad이 호출됩니다. 기하학은 viewWillAppear: 메서드에서 가장 초기에 설정되고 viewDidAppear: 메서드이므로 viewWillAppear:은보기의 실제 프레임/경계를 가질 수있는 가장 빠른 시점이며, viewWillAppear: 메서드에서는 기하 설정, 타이머 시작, 구독 옵저버 등).
당신은 당신의 접근 방식을 바꾸고 싶지 않지만 이러한 규칙에 따라 설계해야한다고하셨습니다.

+1

답장을 보내 주셔서 감사합니다. 그에 따라 코드를 변경했습니다! – MJB

관련 문제