2014-09-25 55 views
6

在我的應用程序中,在iPhone 6上有很多浪費在橫向上的空間,甚至在4「屏幕上的程度也較低。我已經使用iOS 8的UISplitViewController更改來支持iPhone上橫屏的雙窗格視圖6加,但它會是有用看到一些更小的設備這兩個窗格爲好。如何在iPhone 6或5s上支持風景分割視圖?

便利,蘋果不得不其中包括對究竟細節如何做到這一點。你可以download the sample code here,但在短WWDC 2014會話,​​:他們把UISplitViewController放在一個UIViewController的子類中,子類使用setOverrideTraitCollection:forChildViewController:在分割視圖上強制[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular],當它認爲寬度足夠寬時,示例代碼運行良好,並且在大多數設備上仍然可以使用

但是在嘗試在我自己的應用程序中使用此代碼後,我發現它在iPhone 6 Plus上可怕地失敗。你可以看到這個自己,如果你下載示例代碼,使兩個變化:

  • 添加情節串連圖板,空視圖控制器添加到這一點,將其設置爲「啓動畫面文件」。這是在6 Plus上以其原始分辨率運行應用程序所必需的。
  • AAPLTraitOverrideViewController.m中,將第21行更改爲size.width > 500.0或任何大於414的值。這對於確保分割視圖僅在6 Plus上顯示縱向單個視圖是必需的。

現在你可以在模擬器中運行應用程序。要看到問題,只是這樣做:

  • 設備旋轉爲橫向(命令右箭頭)
  • 旋轉立刻回縱向(命令左箭頭)

你已經可以看到某事不對。所有的表格單元都應該在右側有一個箭頭,但是它們不是。他們表現得像他們還處於分裂狀態。如果您點擊其中一行,情況就會變得更糟 - 細節視圖從底部向上滑動,導航欄消失。

我認爲在這裏導致問題的iOS 8中必定存在一個錯誤。但由於此代碼是在iPhone 6 Plus發佈之前共享的,因此似乎可能只需進行一些調整即可使其與該設備兼容。到目前爲止,我找到的唯一解決方案是將第21行更改爲if (size.width > 500.0 && size.width < 736.0)之類的內容,但我不想使用下次Apple引入新屏幕大小時可能再次破解的代碼。有沒有更好的方法來處理這個問題?

回答

8

看起來像你一直想要使水平尺寸類定期(UIUserInterfaceSizeClassRegular)。爲此,請覆蓋traitCollectionDidChange:。在此方法中,如果垂直大小類別爲compact(表明它可能處於橫向),請覆蓋特徵集合以使水平大小類別爲常規。

UITraitCollection *compactHeight = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassCompact]; 
if ([self.traitCollection containsTraitsInCollection:compactHeight]) { 
    UITraitCollection *regularWidth = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]; 
    self.forcedTraitCollection = [UITraitCollection traitCollectionWithTraitsFromCollections:@[self.traitCollection, regularWidth]]; 
    [self setOverrideTraitCollection:self.forcedTraitCollection forChildViewController:_viewController]; 
} else { 
    [self setOverrideTraitCollection:nil forChildViewController:_viewController]; 
} 

但是,如果您需要更具體的行爲,則必須依賴畫布大小來獲取特定於應用程序的行爲。

+0

非常好。我將你的高度檢查改爲'(self.view.bounds.size.width> 500.0)',它似乎正在工作,我希望如何。 (我絕對不希望在4S上有分割視圖,而5S可能會推動它。)有趣的是,這似乎並沒有表現出相同的錯誤,儘管它最終會對特徵集合進行相同的覆蓋。出於好奇,你爲什麼要結合self.traitCollection和regularWidth?它似乎只是使用regularWidth爲覆蓋完成相同的事情? – robotspacer 2014-09-26 07:14:26

+0

@Matt是否可以在iPhone 6上啓用此功能? – Besi 2016-10-16 12:00:18

+1

@Besi當然。同樣的事情會奏效。只需重寫iPhone 6的特徵集合即可,而不是緊湊的。 – 2016-10-18 16:38:28