반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

JQuery Mobile - Theming Page

2012. 7. 12. 20:57 | Posted by 솔웅


반응형

Page Theming


jQuery Mobile 에서는 페이지의 style을 지원하는 rich theming system을 제공하고 있습니다. 각 페이지 위젯에는 자세한 theming documentation이 있습니다. 이 글에서는 어떻게 theming이 apply 되는지 몇개의 high-level 예제들을 살펴보도록 하겠습니다.


data-them attribute는 헤더나 footer 콘테이너에 apply 될 수 있습니다. 이 콘테이너에 apply 되서 lettered theme color swatch들을 적용할 수 있도록 합니다. data-theme attribute가 content container에 적용 될 때에는 data-role="page"가 적용된 div나 콘테이너에 넣으라고 권장 드립니다. 그렇게 하면 배경색이 전체 페이지에 적용될 수 있습니다. 이 작업이 끝나면 페이지의 모든 위젯들은 그 페이지 콘테이너에 적용된 theme을 상속 받게 됩니다. header와 footer에는 디폴트로 theme "a"가 적용 됩니다. 모든 element에 theme "b" 가 적용되기를 원하신다면 이것을 header나 footer에 적용 시키세요. 페이지 div에 data-theme="b"를 하듯이 header와 footer div에도 이렇게 하면 됩니다. 이 디폴트 theme은 다양한 견본(swatches)들을 활용해서 visual texture를 만들고 각각 에 맞는 최상의 contrast를 다양한 element들에 적용하고 있습니다.




위 화면에 대한 소스와 기타 theme a ~ e 까지의 간단한 예제가 있는 소스를 아래에 올립니다.


themingpages.html


그리고 Tutorial Page에 가시면 A~E 까지의 theme들을 적용한 각 form 들을 보여주는 페이지가 있습니다.


이 페이지들을 따로 작업해서 파일로 만들었습니다.

보시면 도움이 될 겁니다.



themingApage.html


themingBpage.html


themingCpage.html


themingDpage.html


themingEpage.html



소스들을 보시면서 이것 저것 바꾸시고 테스트해 보시면 확실히 자기것으로 만들 수 있을 겁니다.


그럼 항상 즐 코딩 하세요.


반응형

'jQuery Mobile > JQM Tutorial' 카테고리의 다른 글

Fixed toolbars  (0) 2012.07.28
JQuery Mobile - Navbar  (2) 2012.07.25
JQuery Mobile - Footers  (0) 2012.07.24
JQuery Mobile - Header structure  (0) 2012.07.23
JQuery Mobile - Toolbar types  (0) 2012.07.21
JQuery Mobile - touchOverflow 기능  (0) 2012.07.09
JQuery Mobile - PhoneGap apps  (1) 2012.07.09
JQuery Mobile - Scripting pages  (1) 2012.07.05
JQuery Mobile - Dynamically Injecting Pages  (0) 2012.06.28
JQuery Mobile - Ajax, hashes & history 02 -  (0) 2012.06.27

Best Practices for Organizing Projects

2012. 7. 11. 11:33 | Posted by 솔웅


반응형
Posted on

. Written by


샘플코드나 다른 예제 혹은 이 웹사이트의 튜토리얼을 포함해서 코로나를 배우는데 명료하게 알기 힘든것이 바로 프로젝트를 어떻게 organize 할 것이냐 입니다. 알려 드릴 사항은 모든것이 여러분의 project 폴더 아래로 가게 된다는 거고 나머지는 여러분 취향대로 하시면 되는겁니다. 그리고 sub folder 도 지원 됩니다. 여기까지가 지금까지 이 주제와 관련해서 저희가 한 말이죠.


그런데 여러분의 프로젝트가 규모가 더 커지면 이 지식만 가지고는 organize 하기가 좀 부족합니다. 점점 더 많은 리소스들이 여러분 프로젝트에 추가 될 겁니다. 오디오 파일이나 이미지, 비디오, 루이 모듈 같은 것들이요. 이걸 제대로 정리하지 못하면 개발하는데 아주 복잡하게 만들죠.


이 튜토리얼은 코로나 SDK 프로젝트 organization 테크닉의 전부를 말하지는 않습니다. 단지 좀 더 효율적으로 관리할 수 있는 방법을 제안할 뿐입니다.




Project Structure


모든걸 간단하게 가지고 가는 것은 여러분의 프로젝트가 잘 organize 되어야하고 그로 인해 유지 관리하는 것이 쉽도록 하는 겁니다. 제가 소개할 이  organization technique 은 대부분의 프로젝트에서 쉽게 셋업하고 쉽게 이해하고 쉽게 scale (여러분의 프로젝트가 점점 더 커지게 될 때를 대비해서) 하는데 충분히 도움이 될 겁니다.


프로젝트 폴더를 구성할 때 여러분이 따라야할 기본적인 전제는 비슷한 파일들을 다른것과 별도로 보관하라는 겁니다. 비슷하고 다르다는 기준은 type 이나 그 종류를 말할 수도 있습니다. 아래 샘플로 제공하는 프로젝트 hierarchy 구조가 있습니다.


  • Project_Folder/ (top-level)
    • images/ (folder)
    • audio/ (folder)
    • videos/ (folder)
    • data/ (folder)
    • scripts/ (folder)
    • main.lua
    • config.lua
    • build.settings
    • Default.png
    • Default@2x.png
    • Icon.png
    • Icon@2x.png


위의 폴더 구조 예제에서 top-level 디렉토리(폴더) 에 있는 것은 가장 중요한 것은 main.lua 입니다. 다른 config.lua, build.settings 같은 파일들도 top-level에 있어야 된는 겁니다.

이 top 에 있는 폴더들은 그 이름만 봐도 어떤 것들인지 쉽게 이해가 갈 겁니다. 아래 간단히 설명을 덧 붙이겠습니다.

  • images – image files with the extension of (most-likely) .png or .jpg.
  • audio – audio files (.caf, .mp3, .ogg, etc.)
  • videos – video files (.avi, .mp4, etc.)
  • data – read-only data files used by your app. They can really be any format, but common ones include .json and .xml.
  • scripts – other Lua files (apart from main.lua). More on this in a moment.


더 이상의 설명은 필요 없겠죠? script 폴더만 제외하고는요.

여러분이 util.lua를 사용해야 한다고 가정해 봅시다. 일반적이로 이 파일을 top-level에 위치시키는데요. (main.lua 하고 같은 위치에요). 만약 그렇게 할 경우 아래처럼 불러올 수 있습니다.


local util = require( "util" )


만약 이 util.lua를 scripts 폴더 아래에 넣었다면 위와 같이 하면 작동하지 않을 겁니다. 폴더이름에 점을 붙이고 모듈 이름을 넣으셔야 합니다. 아래처럼요.


local util = require( "scripts.util" )


이미지를 불러올때는 폴더 이름을 쓰고 / 를 넣고 이미지 이름을 넣으셔야 합니다. script에서는 .을 사용했는데 여기서는 /를 사용해야 합니다. 사실 스크립트만 다릅니다. 아래 그 예제가 있습니다.


local obj = display.newImage( "images/corona.png" )


Scaling Projects

여러분의 프로젝트에 더 많은 이미지나 스크립트 그리고 다른 파일들이 추가되면 이 sub directory 만으로도 충분하지 않게 되죠. 그렇게 되면 서브 디렉토리 안에 또 다른 서브디렉토리를 넣어야 겠죠. 아래 depth 가 더 늘어나도 그 안에 있는 파일이나 스크립트를 require 하는 방법은 위에서 설명한 것과 같습니다. 아래는 몇단계의 level 이 있는 게임을 상상하고 폴더 구조를 구성해 봤습니다.


  • Project_Folder/ (top-level)
    • images/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • audio/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • videos/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • data/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • scripts/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • main.lua
    • config.lua
    • build.settings
    • Default.png
    • Default@2x.png
    • Icon.png
    • Icon@2x.png


위의 구조와 다른 점은 이미지,오디오, 비디오, 스크립트 디렉토리들이 이제 그 안에 또 sub-directory들을 가지고 있다는 겁니다. 각각의 레벨 별로 구분되는 서브 폴더들을요. 10단계 20단계 되는 게임을 상상해 보시면 이런식으로 개발하는 것이 훨씬 더 간편하겠죠? 오랫동안 유지 관리하는데 훨씬 유리하게 잘 조직화 돼 있다고 할 수 있습니다.


50단계가 있는 게임인데 모든 리소스를 top-level  프로젝트 디렉토리에 보관하고 있다고 상상해 보세요. 유지 관리하는 관점에서 보면 악몽이 되겠죠?


이 튜토리얼에서 소개한 대로 프로젝트 구조를 관리하시던지 아니면 여러분만의 방법을 사용하시던지 Corona SDK 프로젝트를 시작할 때 프로젝트의 파일구조를 충분히 고민하시고 난 후 시작하는것이 나중에 가서 훨씬 더 도움이 되실 겁니다.



반응형


반응형

touchOverflowEnabled: Deprecated in 1.1.0

jQuery Mobile 1.1 이전에서는 true fixed toolbar 지원이 touch에 대해 overflow-scrolling 하는 CSS 프로퍼티로 native browser 지원이 가능했었습니다. 지금은 iOS5에서만 지원되고 있습니다. jQuery Mobile 1.1 버전에서는 이 CSS 프로퍼티를 더 이상 사용하지 않습니다. 우리는 이 프로퍼티를 내부적으로 사용하는 부분을 모두 없앴습니다. 하지만 이미 이 프로퍼티를 사용하고 있는 어플리케이션에 문제가 발생하지 않도록 $.mobile 객체에 글로벌하게 정의해 놓고 있습니다. 이 프로퍼티는 remove 하라고 flag 되어 있습니다. 하지만 아직까지 $.support 를 통해서 남아있고 지금 현재로서는 이것을 완전 remove할 계획을 가지고 있지는 않습니다.


touchOverflow: Improved page transitions and true fixed toolbars


현재 보이는 화면과 앞으로 전환될 화면은 viewport에 나란히 있습니다.  이 화면전환이 아래쪽으로 된다면 이 두 페이지가 화면전환이 시작될 때 같은 viewport에 있어야 합니다. 그리고 손가락을 위쪽으로 해서 scroll을 하겠죠. 그러면 그 다음 화면이 밑에서부터 따라 올라올 겁니다. 만약에 back button을 클릭한다면 scroll up 하고 화면전환을 하고 이전 scroll position을 저장해야 합니다 .아직까지 모바일 브라우저의 속도가 느린편이라 이 스크롤 움직임은 실제 유저의 움직임을 따라가지 못할 수 있습니다.


이러한 문제점을 극복할 방법은 두 페이지를 각각의 콘테이너에 담는것입니다. 각각은 나름대로의 internal scroll bark 를 가지고 있습니다. 이 의미는 document를 더 이상 scroll 할 필요가 없다는 것이죠. 혹은 좀 더 자연스럽게 스크롤 포지션을 저장하는 것이 필요하다는 겁니다. fixed toolbar들을 만들어서 internal scrolling 과 함께 바깥의 콘테이너에  넣음으로서 이를 쉽게 구현할 수 있습니다.


How it works


overflow:auto 의 touch-targeted version을 지원하는 iOS5 를 한번 보죠. 여기에서는 native momentum scrolling과 함께 internal scrolling region을 허용합니다. 우리는 여기에 touchOverflow 라는 기능을 추가했습니다. 이 기능은 이 두개의 true "fixed" toolbar들을 사용할 수 있는 새로운 CSS capability들을 가능하게 합니다. 그로 인해 iOS5에서 아주 부드럽게 화면전환이 일어나도록 만들죠. 모두 웹 표준을 사용하고 있고 약간의 코드를 추가했습니다.


이 기능은 touchOverflowEnabled 라고 부르는데 CSS에서 overflow scrolling을 지원할 미래의 브라우저를 위해 디자인 됐습니다. 이 기능은 최고의 퍼포먼스를 위해 아직 테스트와 디버깅이 필요하기 때문에 디폴트로 off 상태입니다. 조만간 이 기능을 on 으로 활성화 할 수 있기를 바랍니다. 아래에 이 global option을 어떻게 enable 시키는지 예제가 있습니다.


<script>
$(document).bind("mobileinit", function(){
  $.mobile.touchOverflowEnabled = true;
});
</script>



이 기능이 activate 되면 프레임워크는 이 두 overflow를 브라우저가 support 하는지 찾게 됩니다. 그리고 -webkit-overflow-scrolling:touch CSS properties 를 찾게 되죠. 이 두가지를 지원하는 브라우저에서는 native overflow와 함께 dual page container 모델로 switch 합니다. 그래서 각각의 안에서 스크롤링을 하게 되어 true fixed toolbars smooth transition이 일어나도록 하죠. 이렇게 하면 native performance에 아주 가까운 인터페이스 build를 가능하도록 해 줍니다.

이 기능의 demo 를 보시려면 iOS5의 이 페이지를 체크하세요.


A few downsides


새 기능인 경우 완벽할 수는 없습니다. 이 기능을 activating 할 때 몇가지 고려해야 할 사항들이 있습니다.


  • 리스트나 form 같은 child element들은 가끔 iOS5에서 overflow된 페이지내의 embedded 일 때 render를 하지 않는 경우가 있습니다. 아주 random 하게 일어나는 현상이지만 그냥 둘 수는 없는 문제죠. 그래서 우리는 translage-z CSS 프로퍼티를 추가해서 IOS가 content를 render 하도록 force 하고 있습니다. 이 경우의 단점은 transform이 apply 됐을 때 모든 elements들은 relative 로 포지션이 set 되서 여러분의 layout에 어떤 이슈가 발생할 수가 있습니다.
  • -webkit-overflow-scrolling:touch는 status bar 를 tap 했을 때 위에서 아래로 스크롤 하는 이벤트가 제대로 작동하지 않는 것 같습니다. 애플에서 이와 관련해서 개선해주기를 바랍니다. 왜냐하면 이 기능은 아주 필요하거든요.
  • overflow이고 -webkit-overflow-scrolling:touch 프로퍼티가 세팅돼 있을 때 iOS는 그 parent의 (우리의 경우는 page) 어떤 overflow:hidden 프로퍼티도 무시하는 현상이 나타납니다. 그래서 viewport보다 넓은 이미지나 코드 블럭이 있다면 horizontal scrolling 이 나타납니다.
  • 이 기능이 active 일 때 메타 viewport 태그를 사용하게 되면 유저 zoom 이 제대로   작동하지 않게 됩니다. 왜냐하면 툴바와 페이지 콘텐트 모두 이상한 size로 zoom될 수 있고 다시 zoom back out 하는것이 무척 어렵기 때문입니다. 이런 이상한 현상을 완화하기 위해 우리는 fixed toolbar와 overflow container를 사용하는 것이 더 중요하게 됩니다.
  • re-load 된 페이지로 되돌아갈 때 스크롤 포지션을 잃어버릴 수가 있습니다. 만약 DOM caching이 on 상태이면 이런 이슈는 거의 발생하지 않을 겁니다.
  • 이 기능은 아직까지 실험적입니다. 그러니까 이런 이상한 현상들이 모두 해결된 상황은 아닙니다. 주의해서 사용하시고 항상 테스트를 하세요.


Don’t other mobile platforms already support overflow?


예 다른 플랫폼도 overflow를 지원합니다. 안드로이드의 허니컴과 블랙베리의 플레이북도 overflow를 지원합니다. 하지만 저희가 테스트해 본 결과 그 기기들에서의 overflow는 부드럽지 않습니다. 페이지들은 버벅거리거나 스크롤링 동안에 잠깐씩 멈칫멈칫 합니다. 저희들은 이 기계 제조사들에게 이 기능이 개선되어야 한다고 의견을 제시하고 있습니다.


더 중요한 것은 overflow가 정확하게 되어야 하는것입니다. 우리가 그냥 간단하게 페이지의 auto CSS rule에 overflow를 설정해 놓으면 안드로이드나 iOS의 이전 버전이면서 많은 사람들이 사용하는 플랫폼에서는 내용의 나머지 부분이 잘려나갈겁니다. (iOS의 경우에는 이런 경우 two-finger scroll을 할 수 있을 겁니다. 하지만 아무도 모르고 있을 겁니다.) iOS5에서 애플은 CSS 프로퍼티 -webkit-overflow-scrolling:touch 를 추가했습니다. 현명한 조치라고 생각합니다. 이렇게 함으로서 저희들은 이 touch 스크롤링 프로퍼티를 테스트할 수 있었습니다. 그래서 만약 이 기능을 지원한다면 그 브라우저에서는 overflow rule을 추가할 수 있겠죠.


우리는 이 CSS-based 프로퍼티들을 지원해 달라고 디바이스와 브라우저 개발사들에게 요청하고 있습니다. 왜냐하면 이 기능이 rich mobile 웹 앱을 만드는데 아주 중요한 요소가 될 거라고 믿기 때문입니다. 만약에 오페라, 파이어폭스, 마이크로 소프트같은 회사에서 이 기능을 지원하면 우리는 이 touch scrolling property를 위해 vender-prefixed additions를 추가할 것입니다. 사람들이 IOS5에서 얼마나 페이지 전환이나 fixed toolbar들이 더 훌륭하게 진행되는지를 보게 되면 다른 브라우저들에서도 하루빨리 이 기능을 적용할 거라고 기대합니다. JS-based scroller script들은 새로운 CSS capability 들이 지원되지 않는 브라우저에 polyfill로서 존재하고 있는 상황입니다. 우리는 모바일 웹의 잠정적인 개선사항을 다루는 툴을 통해 간단하게 이 기능을 볼 수 있을 뿐입니다.


Debugging touchOverflow


일반적으로 touchOverflow 는 overflow area의 touch-scrolling을 지원하는 디바이스에서만 가능합니다. 데스크탑에서는 가능하지 않습니다. 그래서 이 touchOverflow 기능을 디버깅하는것이 어렵습니다. 이 touchOverflow 를 모둔 브라우저에서 가능하도록 하려면 아래 예제처럼 하세요.


<script>
$(document).bind("mobileinit", function() {
  $.support.touchOverflow = true;
  $.mobile.touchOverflowEnabled = true;
});
</script>



반응형