2013-08-05 208 views
0

啓動應用程序我有,我只想與景觀工作的應用程序。在橫向模式下

這是第一次,我在前述IB,並試圖以編程方式設置了我所有的意見,所以我創建一個視圖和方法的loadView加入一串子視圖:

self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 

// Create a GMSCameraPosition that tells the map to display the 
// coordinate -33.86,151.20 at zoom level 6. 
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86 
                 longitude:151.20 
                  zoom:6]; 

self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; 
self.mapView.myLocationEnabled = YES; 
self.mapView.delegate = self; 
self.mapView.mapType = kGMSTypeHybrid; 
self.mapView.frame = self.view.frame; 
[self.view addSubview:self.mapView]; 

// add the toolbar 
UIToolbar* toolbar = [[UIToolbar alloc] init]; 
toolbar.frame = CGRectMake(0, self.view.frame.size.height - 44, self.view.frame.size.width, 44); 
toolbar.barStyle = UIBarStyleDefault; 
NSMutableArray* items = [NSMutableArray array]; 
[items addObject:[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"location-arrow.png"] 
                style:UIBarButtonItemStyleBordered 
               target:self 
               action:@selector(locateMe:)]]; 
[items addObject:[[UIBarButtonItem alloc] initWithTitle:@"Tools" 
                style:UIBarButtonItemStyleBordered 
               target:self 
               action:@selector(toolsButtonTapped:)]]; 
[toolbar setItems:items]; 
[self.view addSubview:toolbar]; 

在我的項目設置,我禁用了兩個肖像方向。我也有這個在我的根視圖控制器:

// Enforce Landscape Orientation 
-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

我的問題是在橫向模式下開始,但所有的意見是尺寸適於人像模擬器 - 所以我的看法底部塊低於屏幕和我的屏幕右側是一個很大的空白區域。

我試圖通過切換應用框架的寬度和高度在第一線固定這一點,但然後離開屏幕的狀態欄的左邊緣一些空垂直空間。

那麼,有什麼做什麼,我試圖做的正確方法是什麼?

+0

只是想知道,在測試時會發生什麼設備? – Squatch

+0

你可以嘗試'self.view.transform = CGAffineTransformMakeRotation(M_PI/2);' –

+0

@Squatch:這是一個新客戶端的應用程序,所以它是用他們的帳戶創建的,我不能以成員身份加入直到會員中心恢復正常,所以我無法在設備上運行它。 – Shinigami

回答

2

而不是使用[[UIScreen mainScreen] applicationFrame]

嘗試使用[[[[[self view] window] rootViewController] view] bounds]

的邊界將代表寬度和高度因爲邊界將考慮已應用的變換(旋轉),而幀不會。

要明白我的意思,設置斷點,並在調試器打印出的最高級別視圖的描述lldb> po [[[[self view] window] rootViewController] view]

你會看到,視圖將其旋轉變換,並且它的框架並不代表橫向屏幕的尺寸,但代表縱向的尺寸!


長的方式來計算正確applicationFrame將

BOOL iOS7 = NO; 
NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) 
    iOS7 = YES; 

CGRect theFrame; 
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
CGRect screenBounds = [[UIScreen mainScreen] bounds]; 

if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { 

    theFrame.origin = CGPointZero; 
    theFrame.size.width = screenBounds.size.height; 
    theFrame.size.height = screenBounds.size.width; 

    if (iOS7 == NO) { 
     // statusBarFrame will be CGRectZero if not visible, so this is safe 
     theFrame.size.height -= statusBarFrame.size.width; // because we're in landscape orientation 
    } 
} 
else { 

    theFrame = screenBounds; 

    if (iOS7 == NO) { 
     // statusBarFrame will be CGRectZero if not visible, so this is safe 
     theFrame.size.height -= statusBarFrame.size.height; // because we're in portrait orientation 
    } 
} 
+0

'[[[[self view] window] rootViewController] view]'是'self。view'。我不應該只是在窗口的邊界?無論如何,我會放棄它。 – Shinigami

+0

在上面添加了更多細節。希望這可以幫助。 –

+0

長計算完美。謝謝。 – Shinigami

0

在當前視圖 - 控制將這個 // IOS 5

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 


     if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) { 
      return YES; 
     } 
     return NO; 
    } 

// iOS6的

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 
+0

這在iOS 6中已棄用。Xcode說我應該使用我正在使用的2種方法。 – Shinigami

+0

檢查更新的答案 –

+0

這就是我在我的問題有什麼了。 – Shinigami

0
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 


    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    { 
     return YES; 
    } 
    return NO; 
} 

將這個代碼的appdelegate .M .....