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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

.delegate() 메소드 알아보기

2012. 8. 23. 10:58 | Posted by 솔웅


반응형

.delegate()


오늘 일하다가 눈에 띈 몇가지 jQuery API를 공부해 보겠습니다.


다른 사람이 만든 소스를 보다 보니까 .delegate() 메소드를 사용한게 있었는데요.

jQuery API에는 이 .delegate() 메소드는 1.4.3 버전에서 사용한 것이고 1.7 버전에서는 .on() 메소드를 사용하고 있다고 하네요.


그 신택스는 아래와 같네요.


$(elements).delegate(selector, events, data, handler); // jQuery 1.4.3+ $(elements).on(events, selector, data, handler); // jQuery 1.7+


약간 바뀌었죠.

$("table").delegate("td", "click", function() { $(this).toggleClass("chosen"); });

위 소스코드는 1.7 버전에서 아래와 같이 사용할 수 있다고 합니다.


$("table").on("click", "td", function() {
  $(this).toggleClass("chosen");
});






그럼 곧바로 예제를 보죠.


<!DOCTYPE html>
<html>
<head>
 
<style>
  p
{ background:yellow; font-weight:bold; cursor:pointer;
      padding
:5px; }
  p
.over { background: #ccc; }
  span
{ color:red; }
 
</style>
 
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
 
<p>Click me!</p>

 
<span></span>
<script>
    $
("body").delegate("p", "click", function(){
      $
(this).after("<p>Another paragraph!</p>");
   
});
</script>

</body>
</html>


스크립트 부분을 보면 <body> 내에서 p 태그안에 있는 콘텐츠를 클릭하면 그 p 태그 다음에 <p> Another paragraph!</p> 를 추가하는 겁니다.


두번째 샘플을 보죠


<!DOCTYPE html>
<html>
<head>
 
<style>
  p
{ color:red; }
  span
{ color:blue; }
 
</style>
 
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
 
<p>Has an attached custom event.</p>
 
<button>Trigger custom event</button>
 
<span style="display:none;"></span>
<script>

    $
("body").delegate("p", "myCustomEvent", function(e, myName, myValue){
      $
(this).text("Hi there!");
      $
("span").stop().css("opacity", 1)
               
.text("myName = " + myName)
               
.fadeIn(30).fadeOut(1000);
   
});
    $
("button").click(function () {
      $
("p").trigger("myCustomEvent");
   
});

</script>

</body>
</html>


스크립트를 해석해 보자면.

먼저 밑에 button 부분을 봐야 겠네요.

버튼이 클릭되면 myCustomEvent 가 trigger 되네요.


그 다음에 delegate 부분을 봐야 되는데요.

이 myCustomEvent가 trigger 되면 p 태그 부분을 Hi there! 로 고치고 span 부분에 myName = myName 을 표시하는데 잠깐 나타났다가 서서히 사라지는 효과가 나타납니다.



반응형

스토리 보드 기본 사용법

2012. 8. 23. 04:48 | Posted by 솔웅


반응형
Posted on . Written by



스토리보드 API는 아주 강력하고 flexible 하지만 new user들에게는 아주 헛갈리게 한다는 걸 인정해야겠네요. 그리고 Director Class 같은 3rd party scene management library를 사용하다가 스토리보드를 사용하려는 개발자 들도 헛갈릴 겁니다.

오늘은 이 간단한 Storyboard API를 정말 간단하게 사용하고 싶은 분들에게 기본적인 스토리보드 사용법에 대해 안내를 할 까 합니다. 아마 Director Class 만큼이나 간단할 겁니다. 스토리보드에는 많은 유용한 기능이 있지만 이 기능들이 항상 사용되야만 하는 것은 아닙니다. 그러니까 처음부터 이 모든걸 다 이해할 필요는 없습니다.

이 튜토리얼은 스토리보드 API를 빠르고 쉽게 사용할 수 있는 기본적인 기능에 대해서 다루려고 합니다.




Setup


스토리보드 API는 대부분의 다른 3rd party scene management libraries 하고는 약간 다른것들이 있습니다. 특히 화면 전환 부분이 그렇죠. 디폴트로 스토리보드의  scene 들은  화면전환 (scene transiton) 할 때 이전 scene들이 removed or purged 되지 않습니다. 대부분의 third-party scene management libraries 에서는 화면이 전환 될 때마다 이전 화면(scene)이 remove 되죠. Storyboard API에서도 이렇게 할 수가 있는데요. 자동으로 이전 scene들을 remove 하려면 함수가 call 될 때마다 inactive scene들을 purge 되도록 main.lua에 세팅할 수 있습니다.



main.lua


local storyboard = require "storyboard"
storyboard.purgeOnSceneChange = true


완전 간단하죠?


Scene Modules



Director class 에서는 scene 모듈은 new()라는 한개의 함수로 만들어 졌었습니다. 이 함수는 scene이 로딩 될 때마다 call 되게 되죠. 옵션으로 scene이 unload 될 때 call 되는 clean() 함수도 있었습니다. 아래는 Director Class에서 보여지는 scene 코드 입니다.


Director Class Scene


module(..., package.seeall)

-- setup function:
function new() 
    local localGroup = display.newGroup()

    local img = display.newImage( "hello.png" )
    localGroup:insert( img )
   
    return localGroup
end

-- cleanup function:
function clean()
    print( "Called when scene is unloaded." )
end



Storyboard API 를 사용할 때도 비슷한 structure와 로직이 적용될 수 있습니다. (위에 Setup 섹션에서 보실 수 있습니다.). Director Class 에서 위와 같이 사용해서 얻는 기능과 비슷하게 Storyboard API에서도 아래와 같이 코딩을 할 수 있습니다.



Storyboard Scene


local storyboard = require "storyboard"
local scene = storyboard.newScene()

-- setup function:
function scene:createScene( event )
    local img = display.newImage( "image.png" )
    self.view:insert( img )
end
scene:addEventListener( "createScene" )

-- cleanup function:
function scene:destroyScene( event )
    print( "Called when scene is unloaded." )
end
scene:addEventListener( "destroyScene" )

return scene



많이 다르지는 않죠? 코딩은 약간 다르지만 그 로직은 완전히 같습니다. createScene 이벤트 리스너에 모든 scene creation과 로직을 넣으시면 됩니다. 그리고 모든 cleanup 코드는 “destroyScene” event listener 에 넣으시면 되죠.


createScene 리스너는 Director의 new 함수와 비슷한 기능을 합니다. 그리고 destroyScene 리스너는 clean 함수와 하는 기능은 거의 같죠. main.lua 파일에 storyboard.purgeOnSceneChange를 true 로 하는 것을 잊지 마세요. 그렇게 하지 않으면 화면은 전환 할 때마다 destroyScene 이벤트가 자동적으로 dispatch 되지 않을 겁니다.


이제 여러분의 Storyboard API의 scene들을 어떻게 하면 Director 클래스와 비슷하게 셋업할 수 있는지 알게 됐습니다. 이제  storyboard.gotoScene() 를 사용해서 화면 전환을 하시기만 하면 됩니다.


Conclusion

Storyboard API 에 가시면 훨씬 더 많은 기능을 보실 수 있을 겁니다. 그 기능들은 필요하실 때만 가져다가 쓰시면 됩니다. 대부분의 경우 특히 Director Class를 사용하시다가 Storyboard로 전환하시는 분들에게는 이 튜토리얼이면 충분히 쉽게 스토리보드를 이해하시고 사용하실 수 있을겁니다.

반응형


반응형

Layout Grid


여러 컬럼을 가진 레이아웃을 사용하는 것은 모바일 기기쪽에서는 별로 권장되지 않는 방법입니다. 화면 크기가 작기 때문이죠. 하지만 작은 것들을 차례대로 좌우로 표시해야 될 때가 있습니다. (버튼이나 탭같은...)

jQuery Mobile framework은 CSS-based 컬럼들을 만드는 간단한 방법을 제공하고 있습니다. ui-grid 클래스를 call 하면 block 스타일 컬럼을 만들 수있습니다.


  • two-column (using the ui-grid-a class)
  • three-column (using the ui-grid-b class)
  • four-column (using the ui-grid-c class)
  • five-column (using the ui-grid-d class)


Grid는 100% width 에다 border나 배경이 없어서 보이지 않습니다. 그리고 padding이나 margin도 없죠. 그래서 그 안에 어떤 style과 함께 서로 간섭할 수가 없습니다.

Grid 콘테이너에는 ui-block-a/b/c/d/e 라는 child element들이 할당됩니다. 각 block element들을 side-by-side로 정렬하도록 만드는 거죠. ui-block-a 는 새로운 줄을 시작할 때 사용할 수 있습니다.


Two column grids


2개의 컬럼이 있는 레이아웃을 만드려면 ui-grid-a 클래스를 div에 넣습니다. 그리고 그 안에 두개의 child 콘테이너를 넣는데요. ui-block-a 는 첫번째 컬럼이 되고 ui-block-b 는 두번째 컬럼이 됩니다.


<div class="ui-grid-a">
	<div class="ui-block-a"><strong>I'm Block A</strong> 
and text inside will wrap</div> <div class="ui-block-b"><strong>I'm Block B</strong>
and text inside will wrap</div> </div><!-- /grid-a -->


위 예제를 실행하면 아래처럼 보일 겁니다.


I'm Block A and text inside will wrap.      I'm Block B and text inside will wrap.


위에서 보듯이 grid block은 디폴트로 아무런 visual styling이 없습니다. 단지 그 내용을 side-by-side로 보여 줄 뿐입니다.


Grid 클래스는 어떤 컨테이너에든지 apply 될 수 있습니다. 다음 예제에서는 ui-grid-a 를 fieldset에 넣을 겁니다. 그리고 두개의 버튼의 컨테이너 안에 각각 ui-block classes 를 넣을 거구요. 이 두개의 버튼들은 나란히 화면의 50%를 차지하게 될 겁니다.


<fieldset class="ui-grid-a">
	<div class="ui-block-a"><button type="submit" data-theme="c">
Cancel</button></div> <div class="ui-block-b"><button type="submit" data-theme="b">
Submit</button></div> </fieldset>




framework은 그리드 안에서 버튼들에 각각 왼쪽, 오른쪽 마진을 넣게 됩니다. 버튼이 한개라면 class ui-grid-solo 를 사용하고 버튼에 ui-block-a 를 추가하면 됩니다. 그러면 이 버튼은 위의 두 버튼과 동일한 마진을 갖게 될 겁니다. 아래처럼요.


<div class="ui-grid-a">
	<div class="ui-block-a"><button type="button" data-theme="c">
Previous</button></div> <div class="ui-block-b"><button type="button" data-theme="c">
Next</button></div> </div> <div class="ui-grid-solo"> <div class="ui-block-a"><button type="v" data-theme="b">More</button></div> </div>





grid를 포함해서 theme 클래스를 추가할 수도 있습니다. 아래에 우리는 두개의

클래스를 추가했습니다. 
ui-bar클래스를 추가함으로서 default bar 패딩이 추가 됐고 ui-bar-e를 추가함으로서 
e 툴바 theme swatch에 background gradient와 폰트 스타일을 적용했습니다.
inline style="height:120px" attribute 도 각 grid에 추가해서 각 grid에 높이를
주었습니다.



소스는 이 글 마지막에 올린 샘플 파일을 참조하세요.


Three-column grids


다른 grid 레이아웃은 parent에 class=ui-grid-b 를 사용해서 만들 수 있습니다. 이렇게 하면 3개의 child 콘테이너 element들을 만들게 됩니다. 3개의 child는 각각 ui-block-a/b/c class를 갖게 됩니다. 그러면 각각 33%의 width를 갖는 grid가 나타날 겁니다. Note: 샘플 파일에는 style을 적용했습니다. 그래서 각 grid를 구분해 놔서 눈으로 확인 하실 수 있으실 겁니다.


<div class="ui-grid-b">
	<div class="ui-block-a">Block A</div>
	<div class="ui-block-b">Block B</div>
	<div class="ui-block-c">Block C</div>
</div><!-- /grid-b -->






각 grid 안에 버튼을 넣을 수도 있습니다. (샘플파일 참조)




Four-column grids


25/25/25/25% grid 로 4개의 컬럼을 만들 수있는데 이것은 parent에 class=ui-grid-c를 넣어서 만들 수 있습니다.



Five-column grids


20/20/20/20/20% 이렇게 5개의 컬럼은 class=ui-grid-d 로 만들 수 있습니다.




Multiple row grids


여러줄로 된 grid를 만들 수도 있습니다. 예를 들어 3개 컬럼 grid를 container에 지정하고 (ui-grid-b) 그 안에 9개의 child block이 있다고 생각해 봅시다. 그러면 각 블럭들이 3줄로 표시 될 겁니다. 한 줄을 끝내고 다른 줄을 시작하기 위해 CSS 룰을 따라야 합니다. class=ui-block-a 는 새로운 줄을 시작하는 신호가 될 겁니다. (a, b, c, a, b, c, etc.) 이렇게 반복하면 여러줄을 만들 수 있습니다.

자세한 것은 샘플 파일을 참조하세요.



Grids in toolbars


Grid는 툴바에 layout을 만드는데 유용하게 활용할 수 있습니다. 아래는 footer에 4개의 컬럼을 가진 grid를 넣어서 활용한 예입니다. 소스는 샘플파일을 참조하세요.




layoutGrid.html




반응형


반응형
Posted on . Written by


또 다시 돌아왔습니다. FAQ 시간 입니다. 아래 자주 나오는 질문 5가지가 있습니다. 오늘은 Display object를 Lisener로 pass 하는 방법과 off-line에서 CoronaSDK document에 접근하는 방법에 대해 얘기하겠습니다.



1. How can I access the display object in the “transition.to” listener?

"tween" 이 finish 할 때 call 되는 리스너 함수로 transition.to과 transiditon.from 파라미터가 있습니다. 

리스너에 보내지는 파라미터는 transition에 의해 콘트롤 되는 Display Object(target)의 reference 입니다. 이것은 여러분에게 multiple transition들에 대해 일반적인 리스너를 이용할 수 있도록 해 줍니다.


local square = display.newRect( 0, 0, 100, 100 )
local w,h = display.contentWidth, display.contentHeight


local function listener1( target )
        print( "Transition 1 completed on object: " .. tostring( target ), target.x, target.y )
end


transition.to( square, { time=1500, alpha=0, x=(w-50), y=(h-50), onComplete=listener1 } )



Note 제가 onComplete=listener1()를 사용하지 않고 onComplete=listener1를 사용했죠? 둘 이 다른 점은 onComplete=listener1는 리스너의 함수에 레퍼런스를 passing 한다는 겁니다. onComplete=listener1()는 리스너를 initialization 할 때 call 하죠 그리고 transition (화면전환)이 끝났을 때 call 되는 함수처럼 리스너로부터 return 되는 것을 사용합니다.


2. I need to cancel the “transition” for multiple display objects. Is there an easy way to find the transition ID for each object?


transition을 cancel 하려면 transition.cancel을 call 해야 되요 이때 transition ID로 call 해야 됩니다. 이 transition ID는 transition이 처음 생성될 때 return 됩니다. 이 ID는 어딘가에 저장해 놔야 됩니다. 로컬 변수나 테이블에 저장할 수 있겠죠.


그런데 더 쉬운 그리고 더 편한 방법은 그 객체 자체에 attach 하는 겁니다. 코로나에서는 display object에 custom property들을 추가 할 수 있는 기능을 제공합니다. transitionID라는 custom property를 만들어서 여기에 저장하면 좋습니다.


저는  display의 이름을 저장하는데도 사용합니다. 그러면 디버깅할 때도 편리합니다. (e.g., object.name).

아래 transitionID를 어떻게 저장하는지 보여주는 예제가 있습니다



local square = display.newRect( 0, 0, 100, 100 )
local w,h = display.contentWidth, display.contentHeight


local function listener1( target )
        print( "Transition 1 completed on object: " .. tostring( target ), target.x, target.y )
end


square.transitionID = transition.to( square, { time=3000, alpha=0, x=(w-50), y=(h-50), onComplete=listener1 } )
timer.performWithDelay( 1500, function() transition.cancel( square.transitionID ) end )



위 코드는 transition 이 반쯤 됐을 때 cancel 하는 timer 함수를 추가했습니다. 나머지는 첫번째 예제와 비슷하고 움직이죠. 여기서는 이 transition을 cancel 하기 위해 필요한 ID를 save 하기위해 square.transitionID를 사용했습니다.



3. How can I pass the display object to a function when I’m using “timer.performWithDelay”?


비슷한 질문에 대한 대답을 FAQ #3에서 했었습니다만 어떻게 Display Object를 listener로 pass 하는지에 대해 보여 드리겠습니다.

timer.performWithDelay는 보통 listener의 address(reference)와 함께 call 됩니다. 그러니까 delay가 finish 된 후에 call 될 수가 있죠. 

여기서 함수가 call 됐을 때 pass 되는 display object에 대한 reference를 hold 할 로컬 변수를 생성하기 위해 루아의 closures를 사용할 수 있습니다. 아래 그 예제가 있습니다.



local rect = display.newRect( 0, 0, 100, 100 )


local function timerListener( object )
    return function()
        print( "Rect x,y = ", object.x, object.y )
    end
end


timer.performWithDelay( 1000, timerListener( rect ) )



timerListener “listener”는 함수에 대한 reference 대신에 call 되는 함수 입니다. 이 함수를 call 하는것은 저장된 object 변수에 접근할 수 있는 anonymous 함수의 reference를 return 하도록 합니다. 그 object는 timerListener에 pass 됩니다. 그 시기는 timer가 첫번째로 initialized 될 때이고 return 된 anonymous 함수는 delay time이 종료 된 이후에 call 된 함수처럼 사용 됩니다.

오직 한 객체에 대해서만 리스너를 사용할 거라면 이 방법은 그리 유용하지 않을 겁니다. 이 기능의 장점은 리스너가 많은 객체들을 다룰 때 그 진가가 나타날 겁니다. 그 리스너는 deplay object에만이 아니라 테이블, 스트링 그리고 number에도 적용 됩니다.


4. I’m confused about what parameters are available in event listeners.


리스너에 보내지는 이벤트 파라미터가 무엇인지 이해하시려면 CoronaSDK documentation를 참조하세요.  그리고 리스너에 어떤것이 pass 되는지도 확인하세요. event 정보는 파라미터들의 table 입니다. 이 table을 dump 하는 간단한 예제가 이것을 이해하는데 그리고 디버깅 하는데 도움을 드릴 겁니다. 아래 제가 찾아낸 유용한 디버그 코드가 있습니다. 어떻게 동작하는지 보여주기 위해 touch 리스너를 사용했습니다.



local function touchListener( event )
--- Debug Event parameters printout --------------------------------------------------
print();print( "Listener events:" )
for k,v in pairs( event ) do
print( " " .. tostring( k ) .. "(" .. tostring( v ) .. ")" )
end
--- End of debug Event routine -------------------------------------------------------
return true
end
Runtime:addEventListener( "touch", touchListener )


아래가 스크린을 touch 했을 때 화면에 출력되는 event 파라미터들입니다.


Listener events:
y(66)
x(193)
time(84950.623)
id(userdata: 0x1000df3e0)
phase(began)
yStart(66)
xStart(193)
name(touch)
Listener events:
y(68)
x(193)
time(86388.318)
id(userdata: 0x1000df3e0)
phase(moved)
yStart(66)
xStart(193)
name(touch)
Listener events:
y(68)
x(193)
time(86746.278)
id(userdata: 0x1000df3e0)
phase(ended)
yStart(66)
xStart(193)
name(touch)


5. Sometimes I don’t have an Internet connection. Is there a way to access CoronaSDK documentation off-line?


만약 질문자께서 CoronaSDK subscriber라면 Daily Build page 로 가면 off-line 버전 CoronaSDK API document를 다운 방으실 수 있습니다. CoronaApiDocs file 각 daily build 마다 하나씩 가지고 있습니다. 다운받아서 여러분 컴퓨터에 unzip 하시기만 하면 됩니다. api 폴더를 열고 index.html을 double click을 하세요. 그러면 브라우저에 CoronaAPI document가 열릴겁니다.





여기까지가 오늘의 questions 입니다. 유익한 시간이셨기를 바랍니다.



반응형

JSON 파일 만드는데 도움 주는 툴

2012. 8. 20. 21:00 | Posted by 솔웅


반응형

jQuery Mobile로 웹앱을 만들다 보니 JSON 파일을 많이 다룰 것 같습니다.


그래서 샘플로 Mockup wireframe 만들다 보니까 JSON 파일을 사용하는 샘플 앱을 만들었습니다.


현업들로부터 엑셀 파일로 데이터를 전달 받는데요.

이걸 JSON 파일로 쉽게 만드는 방법이 뭘까 찾아보다가 이 작업을 도와주는 싸이트를 찾았습니다.


Mr. Data Converter


이 싸이트는 엑셀파일에서 그냥 Copy 하거나 CSV에서 데이터를 Copy 한 후에 아래 select menu에서 원하는 파일 형식을 고르시면 됩니다.




Christopher Parker의 CSV to json




이 싸이트는 CSV를 JSON 형식으로 바꿔줍니다.




모두 자바스크립트로 이뤄졌는데요.

위쪽 오른쪽의 View Source를 누르시면 원본 파일도 보실 수 있습니다.


따로 로컬에 복사해서 사용하실수도 있구요.



cvsToJson.html


반응형

CSS Sprite Image 관련 팁

2012. 8. 17. 09:41 | Posted by 솔웅


반응형

CSS Sprite Image 작업을 할 때 고민 되는 거는 어떻게 여러 이미지를 한개의 이미지로 만들고 이것을 어떻게 CSS로 코드화 하느냐 입니다.


코로나 SDK 에서도 Sprite Image 작업을 할 때 똑같은 문제가 있습니다.

코로나의 경우엔 3rd party 프로그램으로 손쉽게 할 수 있었는데요.


CSS Sprite Image 도 이 작업을 도와주는 툴이 있습니다.


CSS Sprite Generator 웹 사이트로 가면 되는데요.

웹 주소는 아래와 같습니다.


http://spritegen.website-performance.org/





가 보시면 한국말/조선말 로도 서비스가 됩니다.


사용 방법은 Sprite 로 만들 여러 이미지들을 zip 파일로 압축합니다.

그리고 위의 Choose File 버튼을 누르고 업로드 합니다.


그리고 나서 맨 아래에 있는 CSS Sprite Image & CSS 버튼을 누르면 됩니다.




그러면 위와 같은 결과가 나오는데요.

저 CSS 코드는 긁어다가 활용하시면 되구요.

Sprite Image는 아래 Download Sprite Image 버튼을 눌러서 다운 받으시면 됩니다.


그리고 또 한가지 팁으로 웹 로딩 속도를 테스트 하는 페이지가 있는데요.


http://webwait.com/




사용 방법은 왼쪽 위에 웹 주소를 넣고 (로컬 컴퓨터에 아파치 같은 웹 서버가 깔려 있으면 localhost 도 작동 하더라구요.) 버튼을 누릅니다.


그러면 5번 로딩을 시도해서 그 평균값을 표시해 줍니다.

로딩 시도 횟수는 마음대로 정하실 수도 있습니다.


반응형


반응형
Posted on . Written by



여러분 앱이 너무 많은 메모리를 차지한다면 OS는 low memory warning을 보낼 겁니다. 이 메세지의 의미는 뭔가 하라는 거겠죠. (메모리를 좀 더 풀어 주라던가 하는....) 계속해서 많은 메모리를 차지하고 있으면 OS는 아마 여러분 앱을 강제로 종료 시킬 겁니다. 여러분 앱이 강제로 종료 되면 유저 입장에서 보면 뭔가가 잘 못되서 앱이 끝난 겁니다. 그 앱에 대해 부정적인 이미지를 줄 수 있겠죠.


오늘 다룰 주제에서는 이 low memory warning이 왔을 때 어떻게 대응할 것인가 입니다. 그리고 crash를 방지하기 위해 해야 할 몇가지를 추천해 드릴거구요.


NOTE: Low memory warnings들은 현재 안드로이드 플랫폼에서는 제공하지 않습니다. 그러니까 오늘의 튜토리얼은 대부분 iOS에 포커스를 둔 겁니다. 하지만 예방 방법은 모든 플랫폼에 마찬가지로 적용할 수 있을 겁니다.






Responding to the Warnings


memory warnings에 응답하기 위해서는 memoryWarning 이벤트 리스너를 Runtime object에 추가 해야 합니다. 이 튜토리얼에서는 여러분이 main.lua에서 작업하는 것을 상정하고 얘기를 진행하겠습니다.


Runtime:addEventListener( "memoryWarning", onMemoryWarning )


만약 memoryWarning 이벤트 리스닝을 중지하고 싶으면 아래처럼 이벤트 리스너를 제거하면 됩니다.


Runtime:removeEventListener( "memoryWarning", onMemoryWarning )


만약 main.lua 가 아닌 다른 모듈에서 이 momoryWarning을 적용한다면 그 이벤트 리스너가 앱이 처음 시작할 때 로딩되지 않을 겁니다. 


The Listener


이제 onMemoryWarning 함수에 실제로 무엇을 넣을지는 여러분이 정하실 사항입니다. 왜냐하면 각 앱마다 로직이 다 다르고 그 자세한 사항은 여러분 만이 알 것이기 때문이죠. 

그 작업을 할 때 아래 사항들을 염두에 두시고 하세요.


  • 필요하지 않은 객체들은 가능한 모두 Unload 한다.
  • 필요하지 않은 이벤트 리스너들 특히 enterFrame 리스너 같은 것들은 stop 시킨다.
  • 현재 active 되 있지 않은 scene들은 Parge 하고 remove 시킨다. (try: storyboard.removeAll())
  • 제일 핵심사항은 필요하지 않은 것들은 다 제거한다 입니다.


아래 예제가 있습니다.


local function onMemoryWarning( event )
    audio.dispose( someAudioHandle )
    storyboard.removeAll()
end
Runtime:addEventListener( "memoryWarning", onMemoryWarning )


Preventing Memory Warnings


여러분이 할 수 있는 최선의 방법은 우선 memory warning이 일어나지 않도록 예방하는 겁니다. 정확히 무엇을 해야 된다라고 딱 찝어 내서 얘기할 수는 없습니다. 왜냐하면 여러분이 앱을 개발하는 사람이기 때문입니다. 그래도 몇가지 아이디어는 드릴 수 있습니다.


  • heavy scene으로 전환하기에 앞서 다른 모든 scene들을 purge 시키세요. (혹은 여러분의 scene을 생성할 때 그 이전의 모든 scene들을 purge 시키세요)
    See: storyboard.purgeAll()
  • 다양한 플랫폼과 디바이스에서 작업을 하신다면 프로그램 내에서 그 디바이스가 lower-performance device인지를 체크하세요. 그렇다면 그런 디바이스에는 다른 그래픽 set을 로드하시거나 좀 더 작은 객체들을 로드하도록 하세요.
  • 뭐가 필요하고 뭐가 필요 없는지 판단해서 불필요한 것들은 버리세요.
  • 코드를 한줄 한줄 다시 살펴 보세요. 혹시 어디엔가 메모리 누수현상이 없는지......


여러분들 앱에 맞게 여러분이 할 수 있는 다른 많은 것들이 있을 겁니다. 명심할 것은 memory warning 이 일어나기 전에 가능한 많은 리소스들을 free up 시키자는 겁니다. memoryWarning 이벤트에서는 더 말할 나위가 없겠죠. 그렇게 함으로서 OS 가 여러분 App 을 Kill 하는 것을 막는게 목표입니다.

반응형

CSS Image Sprites 실습 해 보기

2012. 8. 16. 05:06 | Posted by 솔웅


반응형

CSS Image Sprites


Image Sprites는 여러 이미지들을 하나의 이미지 파일로 합쳐 넣는 겁니다.

웹페이지에 이미지가 많으면 일일이 server에 request 해야 되기 때문에 로딩 시간이 많이 걸립니다.

CSS Image Sprites를 사용하면 server request를 줄이고 퍼포먼스를 향상시킬 수 있습니다.




위 이미지에는 집과 좌 우 화살표가 있습니다.

한개의 이미지 인데요.

이것을 집, 왼쪽 화살표, 오른쪽 화살표 이렇게 따로 따로 분리해서 하나의 이미지로 사용할 수 있습니다.


위 이미지는 http://www.w3schools.com/css/img_navsprites.gif 에 있습니다.


<!DOCTYPE html>
<html>
<head>
<style type="text/css">
#navlist{position:relative;}
#navlist li{margin:0;padding:0;list-style:none;position:absolute;top:0;}
#navlist li, #navlist a{height:44px;display:block;}

#prev{left:0px;width:43px;}
#prev{background:url('http://www.w3schools.com/css/img_navsprites.gif') 87px 0;}

#home{left:60px;width:46px;}
#home{background:url('http://www.w3schools.com/css/img_navsprites.gif') 0 0;}

#next{left:129px;width:43px;}
#next{background:url('http://www.w3schools.com/css/img_navsprites.gif') 177px 0;}
</style>
</head>

<body>
<ul id="navlist">
  <li id="prev"><a href="#"></a></li>
  <li id="home"><a href="#"></a></li>
  <li id="next"><a href="#"></a></li>
</ul>
</body>
</html>



html 파일을 만들고 위 소스코드를 붙여 넣어 보세요.


그러면 아래와 같이 브라우저에 표시 됩니다.



하나만 분석해 보면

#prev{left:0px;width:43px;}
#prev{background:url('img_navsprites.gif') 87px 0;}


첫번째 left 는 브라우저 상의 위치 입니다. 그러니까 0포인트에서 width 43 픽셀까지를 이용할 거라고 먼저 해 놓고 그 다음에 이미지를 넣습니다.

이미지는 img_navsprites.gif 의 87픽셀서부터 표시합니다. 그러면 87픽셀부터 가로로 43픽셀이 표시 되겠죠.

이게 왼쪽 화살표 입니다.


다른 소스코드 볼까요?


<!DOCTYPE html>
<html>
<head>
<style type="text/css">
#navlist{position:relative;}
#navlist li{margin:0;padding:0;list-style:none;position:absolute;top:0;}
#navlist li, #navlist a{height:44px;display:block;}

#home{left:0px;width:46px;}
#home{background:url('http://www.w3schools.com/css/img_navsprites_hover.gif') 0 0;}
#home a:hover{background: url('http://www.w3schools.com/css/img_navsprites_hover.gif') 0 -45px;}

#prev{left:63px;width:43px;}
#prev{background:url('http://www.w3schools.com/css/img_navsprites_hover.gif') -47px 0;}
#prev a:hover{background: url('http://www.w3schools.com/css/img_navsprites_hover.gif') -47px -45px;}

#next{left:129px;width:43px;}
#next{background:url('http://www.w3schools.com/css/img_navsprites_hover.gif') -91px 0;}
#next a:hover{background: url('http://www.w3schools.com/css/img_navsprites_hover.gif') -91px -45px;}
</style>
</head>

<body>
<ul id="navlist">
  <li id="home"><a href="#"></a></li>
  <li id="prev"><a href="#"></a></li>
  <li id="next"><a href="#"></a></li>
</ul>
</body>
</html>


이것의 원본 이미지는 아래 이미지 입니다.



마우스가 오버 되면 밑의 어두운 이미지가 표시 되도록 하는 것이죠.


직접 만들어서 해 보세요.


마지막 소스코드를 한번 보겠는데요.


<!DOCTYPE html>
<html>
<head>
<style type="text/css">
img.home
{
width:46px;
height:44px;
background:url(http://www.w3schools.com/css/img_navsprites.gif) 0 0;
}
img.next
{
width:43px;
height:44px;
background:url(http://www.w3schools.com/css/img_navsprites.gif) -91px 0;
}
img.before
{
width:43px;
height:44px;
background:url(http://www.w3schools.com/css/img_navsprites.gif) 87px 0;
}
</style>
</head>

<body>
<img class="home"  width="1" height="1" />
<br /><br />
<img class="next"  width="1" height="1" />
<br /><br />
<img class="before"  width="1" height="1" />
</body>
</html>


이 소스코드가 원래는 http://www.w3schools.com 의 CSS image sprites 튜토리얼 첫번째 나온 겁니다.


그런데 제 컴퓨터에서는 크롬에서만 제대로 표시 되서 맨 마지막에 놨습니다.


브라우저에 표시되는 것은 저 위의 첫번째 소스하고 똑 같습니다.


실무에서는 이미지가 많이 들어갈 경우 퍼포먼스를 향상시키기 위해 이 효과를 써 보는 것도 좋을 것 같습니다.


이 sprite image 를 만들고 css 파일을 얻을 수 있는 싸이트로는 SpriteMe가 있습니다.

링크 따라 가셔서 한번 보세요.


그리고 관련 글로는 여기를 참조하세요.



sprite01.html


sprite02.html


sprite03.html


반응형

JQuery Mobile - Basic HTML Styles

2012. 8. 14. 20:42 | Posted by 솔웅


반응형

HTML Formatting


jQuery Mobile에서 content를 styling 하는 기본 접근 방법은 아주 간단합니다. 손쉬운 방법을 사용하죠. 우리의 목표는 브라우저의 native rendering이 우선하도록 한다 입니다. 저희는 그냥 좀 더 읽기 편하도록 약간의 padding만 추가 합니다. 그리고 폰트 family와 색을 적용하기 위해 theming system를 사용합니다.

content styling을 하는 손쉬운 방법을 사용하면 디자이너나 개발자에게 아주 복잡한 style들을 분석하고 수정하도록 하는 대신 간단하고 깨끗한 clean slate를 제공하죠.



Default HTML markup styling


디폴트로 jQuery Mobile themes는 headers, paragraph content, block quotes, anchor links, standard ordered, unordered and definition lists, and tables 같은 표준 markup element들을 위한 스탠다드 HTML style과 size를 사용합니다. 아래에 그 예제들이 있습니다.



H1 Heading

H2 Heading

H3 Heading

H4 Heading

H5 Heading
H6 Heading


이것들은 strong, emphasized 그리고 linked text를 가지고 있는 paragraph 입니다. 아래에 좀 더 많은 text 가 있습니다. 여러분들은 어떻게 HTML markup이 content내에서 역할을 하는지 보실 수 있을 겁니다.


How about some blockquote action with a cite


This is another paragraph of text so you can see how HTML markup works in content. This is another paragraph of text so you can see how HTML markup works in content. This is another paragraph of text so you can see how HTML markup works in content.


저희는 테이블과 fieldset들에 좀 더 가독성 있도록 하기 위해 몇개의 style들을 추가했습니다. 이것들은 또한 쉽게 customs style들에 의해 override 될 수 있습니다.


  • Unordered list item 1
  • Unordered list item 1
  • Unordered list item 1
  1. Ordered list item 1
  2. Ordered list item 1
  3. Ordered list item 1

Definition term
I'm the definition text
Definition term
I'm the definition text

Travel Itinerary

Flight: From: To:
Total: 3 flights
JetBlue 983 Boston (BOS) New York (JFK)
JetBlue 354 San Francisco (SFO) Los Angeles (LAX)
JetBlue 465 New York (JFK) Portland (PDX)


반응형

JQuery Mobile - Theming buttons

2012. 8. 14. 05:39 | Posted by 솔웅


반응형


Theming buttons



jQuery Mobile은 아주 훌륭한 theming system 을 가지고 있습니다. 이  시스템을 이용하면 어떻게 버튼을 style 할 지 정한 후 쉽게 그것을 구현할 수 있도록 도와줍니다.

container에 link가 add 되면 버튼 안의 텍스트 색은 자동적으로 그 버튼 bar나 content box의 색에 따라 시각적으로 구별될 수 있는 색으로 할당 됩니다.  버튼이 theme a 가 적용된 container에 위치되게 되면 버튼의 색은 자동적으로 theme a 가 됩니다. 





Assigning theme swatches


버튼 markup에 data-theme attribute를 추가하면 원하는 button color swatch를 적용할 수 있습니다.

			
<a href="index.html" data-role="button" data-theme="a">Swatch a</a>			


아래에 data-theme attribute를 통해 assign된 여러 버튼이 있습니다.






Theme variations


Swatch "a" on container with themed buttons inside



ButtonThemes.html


반응형