因此,我正在爲iPad構建iOS應用程序。該應用程序嵌入了視頻聊天。我已經獲得視頻聊天,通知等全部工作。我的問題是與界面。我是一個noob當涉及到iOS編程btw;我兩週前纔開始這樣做。對不起,如果這篇文章有點長,我只是試圖強調這裏可能發生的一切以及我的思考過程。任何批評都是值得歡迎的。瞭解座標,視圖,子視圖和方向更改
我有一個顯示大部分信息的UIWebView(稱爲webView)。當點擊一個按鈕時,我希望調整大小並出現一個小的新視圖,其中有三個項目:與您聊天的人(稱爲imageOne),視頻聊天(稱爲imageTwo)以及掛起向上按鈕(稱之爲buttonHangUp)。如果設備處於橫向模式,我希望新的視圖以垂直位置顯示在imageOne,imageTwo和buttonHangUp的右側。如果設備處於縱向方向,我希望新視圖出現在底部,並且imageOne,圖像2和buttonHangUp處於水平位置。
這裏是我的思維過程是如何去:
- 我讀的文章http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html#//apple_ref/doc/uid/TP40007457-CH7-SW14,並認爲有關創建在被調用時的方向改變故事板的替代橫向視圖。然後我意識到這是行不通的,因爲每個webView都是一個獨立的實體,所以當用戶來回切換時,webView上的導航將不同步
- 我意識到我應該放入不同的視圖那裏有imageOne,imageTwo和buttonHangUp。調用該視圖二。 viewTwo應該開始隱藏,並且只有在從webView調用時纔會出現,並且應該在方向更改時重新定位並調整其大小。
我繼續第二個選項(如果有更簡單的方法,或者我應該做其他事情,請讓我知道;我很樂意學習交易的技巧和竅門)。
這裏是我的代碼是如何去:
- 我做了一個全局變量isLandscape一拉蘋果教程那裏
- 我做了6個其他的全局變量,CGRects,各持有不同的項目的位置在縱向和橫向(imageOnePortrait,imageOneLandscape等)
我實現awakeFromNib,肖像變量設置爲項目的初始位置和大小
(void) awakeFromNib { isLandscape = NO; imageOnePortrait = self.imageOne.frame; imageTwoPortrait = self.imageTwo.frame; buttonHangUpPortrait = self.buttonHangUp.frame; [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; }
我按照Apple文檔中所述實現了orientationChanged方法。不過,我取代了UIDeviceOrientation與UIInterfaceOrientation因爲UIDeviceOrientation沒有發送橫向/縱向方向我一直在尋找,但面朝上和麪朝下的消息
- (void) orientationChanged:(NSNotification *)notification { UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; if(UIInterfaceOrientationIsLandscape(interfaceOrientation) && !isLandscape) { CGRect temp = self.videoView.frame; temp.size.width = 360; temp.size.height = 748; temp.origin.x = 664; temp.origin.y = 0; self.videoView.frame = temp; self.imageOne.frame = imageOneLandscape; self.imageTwo.frame = imageTwoLandscape; self.buttonHangUp.frame = buttonHangUpLandscape; isLandscape = YES; } else if (UIInterfaceOrientationIsPortrait(interfaceOrientation) && isLandscape) { CGRect temp = self.videoView.frame; temp.size.width = 768; temp.size.height = 300; temp.origin.x = 0; temp.origin.y = 703; self.videoView.frame = temp; self.imageTwo.frame = imageTwoPortrait; self.imageOne.frame = imageOnePortrait; self.buttonHangUp.frame = buttonHangUpPortrait; isLandscape = NO; } }
在viewDidLoad中,我設置了景觀座標的座標(我假設在調用orientationMade函數之前加載了這些座標,並且它們是相對於videoView的 - 如果需要將它們設置爲相對於其他內容,請糾正我的錯誤;我將它們設置爲與storyboard中的videoView相關) :
imageOneLandscape.origin.x = 20; imageOneLandscape.origin.y = 20; imageTwoLandscape.origin.x = 20; imageTwoLandscape.origin.y = 288; buttonHangUpLandscape.origin.x = 20; buttonHangUpLandscape.origin.y = 556;
在發起視頻通話,我調整web視圖,並顯示videoView功能:
CGRect temp = self.webView.frame; if(isLandscape) { temp.size.width -= self.videoView.frame.size.width; temp.origin.x = 0; temp.origin.y = 0; self.webView.frame = temp; } else { temp.size.height -= self.videoView.frame.size.height; temp.origin.x = 0; temp.origin.y = 0; self.webView.frame = temp; } self.videoView.hidden = FALSE;
,然後我做buttonHangUp功能相反
一些錯誤的事情正在發生:
- 當我切換方向時,videoView並不總是移動或調整大小,並且當它移動時,移動通常會延遲(在物件的其餘部分旋轉後發生一秒ted)
- 當我切換到風景時,imageOne和imageTwo被水平壓扁,並且不在對齊中我已將它們設置在
- 當我切換到肖像時,事情似乎一直在正常工作。 videoView總是去正確的地方,所以它的子視圖(imageOne,imageTwo和buttonHangUp)。
- 的imageOne和imageTwo從縱向視圖消失的時候我躺在ipad的平坦,在不改變取向
- 即使我設置在viewDidLoad中不同的佈局來顯示的意見,它們被複位到它們在故事板具有佈局
任何人都可以向我解釋這裏發生了什麼,爲什麼發生?這對我來說非常混亂。我認爲它與座標系在webView和應用程序本身的座標之間切換,執行不同功能的優先順序(awakeFromNib,第一次從故事板設置視圖座標,viewDidLoad等)有關,以及重繪子視圖,或者結合所有這些問題,甚至更多。接下來我將研究這些問題。
我也希望有人提到什麼是實現我想要的最佳實踐;正如我所說我是新手,而且不幸的是蘋果文檔並沒有涵蓋什麼被認爲是最好的做法,當涉及到我的情況。鏈接到文章也將不勝感激。
我剛剛意識到它的一大部分是我已經啓用了自動佈局和自動調整大小,並且該應用程序在取向改變時調整了大小視圖的自由度;我會在完成調試所有問題後立即發佈完整的解決方案,除非有人來發布併發佈一個問題。我仍然希望對我的解決方案/答案提出任何意見,以使我的工作更加清晰。謝謝! – Bassel 2013-02-26 20:23:37