2013-02-26 34 views
3

因此,我正在爲iPad構建iOS應用程序。該應用程序嵌入了視頻聊天。我已經獲得視頻聊天,通知等全部工作。我的問題是與界面。我是一個noob當涉及到iOS編程btw;我兩週前纔開始這樣做。對不起,如果這篇文章有點長,我只是試圖強調這裏可能發生的一切以及我的思考過程。任何批評都是值得歡迎的。瞭解座標,視圖,子視圖和方向更改

我有一個顯示大部分信息的UIWebView(稱爲webView)。當點擊一個按鈕時,我希望調整大小並出現一個小的新視圖,其中有三個項目:與您聊天的人(稱爲imageOne),視頻聊天(稱爲imageTwo)以及掛起向上按鈕(稱之爲buttonHangUp)。如果設備處於橫向模式,我希望新的視圖以垂直位置顯示在imageOne,imageTwo和buttonHangUp的右側。如果設備處於縱向方向,我希望新視圖出現在底部,並且imageOne,圖像2和buttonHangUp處於水平位置。

這裏是我的思維過程是如何去:

我繼續第二個選項(如果有更簡單的方法,或者我應該做其他事情,請讓我知道;我很樂意學習交易的技巧和竅門)。

這裏是我的代碼是如何去:

  • 我做了一個全局變量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等)有關,以及重繪子視圖,或者結合所有這些問題,甚至更多。接下來我將研究這些問題。

我也希望有人提到什麼是實現我想要的最佳實踐;正如我所說我是新手,而且不幸的是蘋果文檔並沒有涵蓋什麼被認爲是最好的做法,當涉及到我的情況。鏈接到文章也將不勝感激。

+0

我剛剛意識到它的一大部分是我已經啓用了自動佈局和自動調整大小,並且該應用程序在取向改變時調整了大小視圖的自由度;我會在完成調試所有問題後立即發佈完整的解決方案,除非有人來發布併發佈一個問題。我仍然希望對我的解決方案/答案提出任何意見,以使我的工作更加清晰。謝謝! – Bassel 2013-02-26 20:23:37

回答

0

我固定我的代碼調試昨天的幾個小時後。這裏是所有打算是錯的事情,並希望有助於指導如何處理編程切換方向:

  • 首先,在awakeFromNib,不要把它處理cooridinates和地點的任何代碼。 awakeFromNib在視圖開始加載前被調用,所以它對位置一無所知。在viewDidLoad中執行所有座標初始化。
  • 其次,確保將autolayout設置爲off,並將autoresize子視圖的任何容器視圖設置爲off。這讓我絆了一會兒。
  • 三,使用這裏描述的調用設備方向的蘋果方法:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html#//apple_ref/doc/uid/TP40007457-CH7-SW14。我發現這比上面描述的狀態欄方向更可靠。
  • 第四,在上面的代碼中這是錯誤的,並且是我的錯誤,請確保初始化您需要移動的所有組件的大小。上面的CGRects用於在風景和肖像之間移動的原點已經定義,但沒有大小,導致我的視​​圖在設置到它們時消失。
  • 第五,最後,當滑塊出現/消失時,確保對橫向和縱向全局變量進行大小調整,因爲如果設備在那裏與滑塊一起翻轉,那麼通過滑塊上方的代碼將隱藏部分webView。

我仍然歡迎任何有關人們如何處理風景和人像佈局的意見!

1

好吧,你有一個瘋狂的長問題,但我會給你一部分,並告訴你爲什麼你的設備方向不能正常工作。

您沒有指定要爲其生成通知的對象。

更改此:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) 
name:UIDeviceOrientationDidChangeNotification object:nil] 

要這樣:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
     [[NSNotificationCenter defaultCenter] 
     addObserver:self selector:@selector(orientationChanged:) 
     name:UIDeviceOrientationDidChangeNotification 
     object:[UIDevice currentDevice]]; 

也需要注意,您的通知中心的力量不利用是很重要的。您做了額外的工作,而不是抓住通知內發送的實際方向。您無需每次都檢查UIInterfaceOrientation,你可以抓住設備的方向從音符像這樣:

- (void) orientationChanged:(NSNotification *)note 
{ 
    UIDevice *device = note.object; 
    switch(device.orientation)//do whatever you want in each orientation 
    { 
     case UIDeviceOrientationPortrait: 
      break; 
     case UIDeviceOrientationPortraitUpsideDown: 
      break; 
     case UIDeviceOrientationLandscapeLeft: 
      break; 
     case UIDeviceOrientationLandscapeRight: 
      break; 
     default: 
      break; 
    }; 
} 
+1

第一部分沒有必要;請參閱此頁面上的文檔:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html 您可以看到對象是對象你想接收通知,如果你將它設置爲零,它會收到來自所有可以生成通知的通知。唯一可以生成UIDeviceOrientationDidChangeNotification的對象是設備,所以設置它是沒有必要的。感謝第二部分;我喜歡! – Bassel 2013-02-26 21:55:39

+0

沒有問題。好的電話也是零 – 2013-02-26 22:22:26