0

我正在開發一個應用程序,使用鈦的ipad和iphone。您可以在不同的視圖之間導航。第一視圖(您可以轉到其他視圖的主視圖)只能在肖像模式下使用,其餘視圖可以處於任意方向。鈦 - 改變窗口之間的方向

對於這一點,我用不同的窗口:

var winPortrait = Ti.UI.createWindow({ 
    orientationModes : [Ti.UI.PORTRAIT], 
    fullscreen : false, 
    navBarHidden : true, 
    backgroundColor : "#00669c", 

}); 

var appWindow = Titanium.UI.createWindow({ 

    width : Ti.UI.FILL, 
    height : Ti.UI.FILL, 
    fullscreen : false, 
    navBarHidden : true, 
    backgroundColor : "#00669c", 
    backgroundImage : "Default-Portrait.png", 
    orientationModes : [Ti.UI.PORTRAIT, Ti.UI.LANDSCAPE_LEFT, Ti.UI.LANDSCAPE_RIGHT] 
}); 

該工程確定。當我打開每個窗口時,方向更改正常。

爲了解釋我的問題,我將指定我重現它的步驟。

  • 我對景觀觀賞的畫面: enter image description here

  • 我點擊進入主視圖(僅適用於人像)與設備景觀。

  • 主視圖以縱向模式顯示。
  • 我將設備旋轉至縱向。
  • 我去視圖中再次與設備縱向:

enter image description here

  • 如果我改變設備的方向,我收到的方向變化時,應用程序檢測爲風景模式和借鑑類似景觀元素,但窗口或視圖(我不知道),如肖像其繪圖,所以它不能正確調整:

enter image description here

這不會發生在iOS 7,但是當我已經與iOS 5.1試過了,它發生(我沒有的設備與iOS 6.x的嘗試吧)

你知道如何能我解決它還是一個SO問題?

非常感謝。

UPDATE

這是代碼的簡化使用:

在app.js:

var appWindow = Titanium.UI.createWindow({ 

     width : Ti.UI.FILL, 
     height : Ti.UI.FILL, 
     fullscreen : false, 
     navBarHidden : true, 
     backgroundColor : "#00669c", 
     backgroundImage : "Default-Portrait.png", 
     orientationModes : [Ti.UI.PORTRAIT, Ti.UI.LANDSCAPE_LEFT, Ti.UI.LANDSCAPE_RIGHT] 
    }); 

var winPortrait = Ti.UI.createWindow({ 
    orientationModes : [Ti.UI.PORTRAIT], 
    fullscreen : false, 
    navBarHidden : true, 
    backgroundColor : "#00669c", 

}); 

var openView = function(e) { 

    currentView = e.win; 

    if (winPortraitHomeOpened && e.win != 'Home') { 
     appWindow.backgroundImage = ''; 
     appWindow.addEventListener('open', function() { 
      //alert("appwindowopen") 
      if (appWindow != null) { 
       appWindow.height = Ti.UI.FILL; 
       appWindow.width = Ti.UI.FILL; 
      } 
     }); 
     appWindow.open(); 

    } 

    // Dependiendo de la vista, abre una ventana u otra 
    if (e.win == 'Home') { 

     winPortrait.open(); 

     winPortraitHomeOpened = true; 

     setTimeout(function() { 
      var Home = require('/views/Home2'); 
      activeView = Home.Constructor(winPortrait); 
      addActiveViewCloseWin(); 
     }, 10); 

    } else if (e.win == 'test') { 
     var Test = require('/views/test/test'); 
     activeView = Test.Constructor(appWindow, true); 
    } 

    if (currentView != 'Home') { 
     addActiveViewCloseWin(); 
    } 

}; 

var addActiveViewCloseWin = function() { 
    var anim_invisible = Titanium.UI.createAnimation({ 
     opacity : 0, 
     duration : 300 
    }); 
    var anim_visible = Titanium.UI.createAnimation({ 
     opacity : 1, 
     duration : 300 
    }); 

    if (winPortraitHomeOpened && currentView == 'Home') { 
     winPortrait.add(activeView); 
    } else { 
     appWindow.add(activeView); 
    } 

    if (lastActiveView != null) { 
     Trace.info("lastActiveView != null"); 
     lastActiveView.animate(anim_invisible); 

     setTimeout(function() { 

      activeView.animate(anim_visible); 
      lastActiveView.close(); 

      lastActiveView = activeView; 
     }, 300); 
    } else { 
     activeView.animate(anim_visible); 
     lastActiveView = activeView; 
    } 
    activeView.updateOrientation(); 

    setTimeout(function() { 
     if (currentView == 'Home') {    
      appWindow.close();   
     } else { 
      if (winPortraitHomeOpened) { 
       winPortrait.close(); 
       winPortraitHomeOpened = false; 
      } 
     } 
    }, 500); 
}; 

Ti.Gesture.addEventListener('orientationchange', function(e) { 

    // Comprobar que ha cambiado de orientación. Se envían varios eventos juntos 
    var _currentOrientacion = 0; 
    if (utils.isLandscape()) 
     _currentOrientacion = 1; 

    if (_currentOrientacion == orientacion) { 
     return; 
    } 

    orientacion = _currentOrientacion; 


    // Se actualiza las dimensiones y la orientación de los elementos 
    if (!winPortraitHomeOpened && !winPortraitConfOpened) { 
     if (appWindow != null) { 
      appWindow.height = Ti.UI.FILL; 
      appWindow.width = Ti.UI.FILL; 
     } 
    } 

    if (activeView != null) { 
     activeView.updateOrientation(); 
    } 
}); 

Test.js的代碼:

exports.Constructor = function(parent) { 

    var view = Ti.UI.createView({ 
     height : utils.getScreenHeight(), 
     width : utils.getScreenWidth(), 
     backgroundColor : 'red' 
    }); 

    var cabeceraView = Cabecera.Constructor(view); 
    view.add(cabeceraView); 
    cabeceraView.setTitle('Prueba'); 

var backButton = Ti.UI.createImageView({ 
    image : utils.imagesFolder() + "common/returnHome.png", 
    //top : view.height/4, 
    left : utils.todp(8), 
    height : utils.todp(25), 
    width : utils.todp(65) 
}); 

    view.add(backButton); 

backButton.addEventListener('click', function() { 
      openView({ 
       win : 'Home' 
      }); 
     }); 


    var updateFechaCabecera = function() { 
     fechaView.setFecha('XXXX-XX-XX'); 
    }; 
    view.updateFechaCabecera = updateFechaCabecera; 

    var fechaView = Fecha.Constructor(view); 
    view.add(fechaView); 

    updateFechaCabecera(); 

    // Vista ocupa todo salvo cabecera y fecha 
    var mainView = Ti.UI.createView({ 
     height : utils.getScreenHeight() - utils.getCabeceraHeight() - utils.getFechaHeight(), 
     width : '100%', 
     top : utils.getCabeceraHeight() + utils.getFechaHeight(), 
     backgroundColor : "transparent", 
    }); 
    view.add(mainView); 

    // Create a Label. 
    var aLabel = Ti.UI.createLabel({ 
     text : 'aLabel', 
     color : 'pink', 
     font : { 
      fontSize : 40 
     }, 
     textAlign : 'center' 
    }); 

    // Add to the parent view. 
    mainView.add(aLabel); 

    var updateOrientation = function() { 

     Trace.info("updateOrientation de interconexines height width " + utils.getScreenHeight() + ' ' + utils.getScreenWidth()); 
     view.height = utils.getScreenHeight(); 
     view.width = utils.getScreenWidth(); 

     if (utils.isPortrait()) { 
      aLabel.text = "PORTRAIT"; 
     } else { 
      aLabel.text = "LANDSCAPE"; 
     } 

    }; 
    view.updateOrientation = updateOrientation; 


    var cerrar = function() { 
     Trace.info('cerrar Template'); 

     view.visible = false; 
     view.hide(); 

     if (cabeceraView != null) { 
      cabeceraView.close(); 
      view.remove(cabeceraView); 
      cabeceraView = null; 
     } 

     if (fechaView != null) { 
      fechaView.close(); 
      view.remove(fechaView); 
      fechaView = null; 
     } 

     // Eliminamos los elementos de la vista 
     if (view != null) { 
      utils.removeChildrens(view); 
      parent.remove(view); 

     }; 
     view = null; 

    }; 
    view.close = cerrar; 

    return view; 

}; 
+0

http://stackoverflow.com/questions/21873547/orientation-portrait-and-portraitupsidedown-only-for-one-window – Anand

+0

的可能重複我能在不同的窗口中使用不同的方向。我的問題是當我在這些窗口之間進行切換時,我使用設備方向(物理上)進行遊戲。謝謝 –

+0

在方向更改事件中,您是否刪除了視圖並重新構建它,或者允許它自動處理這些調整?我會嘗試刪除orientation事件中的整個視圖,並調用再次構建視圖並將其添加到窗口的函數。如果您可以提出一個展示問題的單個文件代碼示例,我可以在我的系統上進行測試。你的例子很好,我只是不想寫一個模擬應用程序來測試它。這對我來說尤其是Titanium或操作系統的一個問題。 – Martin

回答

0

您是否嘗試刪除var winPortrait中的orientationModes? 您的代碼應該是這樣的:

var winPortrait = Ti.UI.createWindow({ 
    fullscreen : false, 
    navBarHidden : true, 
    backgroundColor : "#00669c", 

}); 
+0

但我想只允許在此窗口(主窗口)中的縱向方向,並在其他窗口中允許任何方向。所以,我認爲我必須說出來。謝謝 –