2016-03-06 129 views
0

我有一個UIViewController包含一對夫婦UIView S和A UILabel,它的呈現全屏幕,嵌入UINavigationController。在一個非緊湊的高度環境(肖像)中,我希望盒子可以堆疊在一起,下面有標籤 - 這是按預期工作的。現在,當旋轉到一個緊湊的高度環境(風景)時,課程的視圖會重新定位,因此現在盒子的寬度會增加,高度會減少。我不想要那種行爲。相反,我希望始終將盒子放在縱向位置,但標籤應該像導航欄一樣旋轉,以便在當前方向上保持可讀。 (這意味着意見的高度將是在這種情況下,更多的收縮了一下,由於導航欄。)防止旋轉的UIView子視圖,允許旋轉同級子視圖

的圖像有助於解釋好了很多:

enter image description here

所以,問題是,如何防止旋轉特定的UIView s,同時仍支持UIViewController中的橫向方向?

我已經看到其他類似的問題,但他們使用不建議使用的方法檢測旋轉到特定的設備方向,這與iOS 8+無關。這個問題是如何在考慮尺寸等級時做到這一點。我相信解決方案將使用viewWillTransitionToSizeanimateAlongsideTransition,但究竟需要做什麼並不完全清楚。

我在這種情況下使用框架佈局,而不是自動佈局。所有視圖都以編程方式創建。這些框實際上是UIView子類的子視圖,它根據父視圖的框架在框中繪製並繪製內容。

UIViewController

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    let topPosition = self.topLayoutGuide.length 
    boxesContainer.frame = CGRectMake(20, topPosition, self.view.frame.size.width - 40, (self.view.frame.size.height - topPosition)/1.5) 

    boxesContainer.updateLayout() 
} 

在盒容器UIView

func updateLayout() { 
    box1.frame = // something based on self.frame 
    box2.frame = // ... 
} 
+0

您是在故事板,xib還是代碼中創建這些視圖? –

+0

@robmayoff代碼 – Joey

回答

0

我研究出瞭解決辦法。本質上,我檢測視圖的寬度是否大於高度,如果是這樣,請旋轉包含這些框的視圖。首先顯示視圖控制器和大小更改時執行此操作。然後根據需要進行計算以更新此視圖的框架。重要的是,盒子容器視圖使用其frame.size.widthframe.size.heightmin放置框。

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    self.optimizeForSize(self.view.bounds.size) 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    //calculate frame for the box container based on current frame 
    //... 

    boxContainer.updateLayout() 
} 

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 

    coordinator.animateAlongsideTransition({ (conext: UIViewControllerTransitionCoordinatorContext) -> Void in 
     self.optimizeForSize(size) 
     self.view.setNeedsLayout() //needed for iOS 8 
    }, completion: nil) 
} 

func optimizeForSize(size: CGSize) { 
    if size.width > size.height { 
     self.boxContainer.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2.0)) 
    } else { 
     self.colorPicker.transform = CGAffineTransformIdentity 
    } 
}