2009년 10월 15일
[iPhone][MonoTouch] 다섯번째 샘플 : Count Me In (2)
지난 설명에 이어서 마무리 해 봅니다.

[iPhone][MonoTouch] 다섯번째 샘플 : Count Me In (1)
Top Bar설정을 하면 뷰의 화면에 네비게이션 바의 공간에 네비게이션 바가 있는 것처럼 화면이 바뀌어 있는 것을 확인 할 수 있습니다. 다른 항목도 같습니다. 뷰에 대한 설정은 다른 속성은 변경할 것이 없고 배경색만 회색으로 설정합니다. 뷰의 각 객체를 다음과 같이 추가합니다.
노란색의 번호는 각 객체를 구별하기 위헤 추가했습니다. 실제 화면과는 관계가 없습니다.
7. FlipsideViewController.xib파일을 Interface Builder로 열고 화면 설계를 하죠. 간단한 안내 페이지라고 생각하면 됩니다.
아이폰의 화면에서 상태바나 네비게이션바, 하부 툴바가 있는 상황을 고려하여 설계를 할 수 있도록 제공하고 있습니다. 뷰의 속성 윈도우의 "Simulated User Interface Elements" 항목 입니다. 3가지 조건이 "None"의 경우는 화면 전체를 사용하는 경우가 됩니다. 이번 예제에서는 "Top Bar"에 "Navigation Bar"가 있는 경우를 설정하고 화면 설계를 하겠습니다.



| Objects | 속성 |
| 1. UILabel | Text : MonoTouch 31 예제 Layout: Alignment = center Size : x=20, y=20, width=280, height=29 |
| 2. UILabel | Text : 예제 5: Count Me In Layout: Alignment = center Size : x=20, y=57, width=280, height=29 |
| 3. UITextView | Text : (화면에 보이는 것처럼 넣어 주세요) Size : x=20, y=850, width=280, height=311 |
완료한 내용을 저장하고 Interface Builder를 종료합니다. 이번 화면 설계에서는 Outlet이나 Action을 추가하지 않았기 때문에 FlipsideViewController.xib.designer.cs파일을 편집기로 보면 "view" 이외에 추가된 내용이 없습니다.
8. infoButton을 터치했을 때 앞에서 설계한 뷰로 전환 되도록 코드를 추가합니다. infoButton의 이벤트를 처리하는 RootViewController.xib.cs파일을 편집기로 불러 들입니다. FlipsideViewController를 생성하는 함수와 이벤트 처리 Action의 내용을 다음 소스를 참고하여 추가 합니다.
함수 loadFlipsideViewController()를 작성합니다. 이 함수의 역할은 FlipsideViewController객체 생성과 네비게이션바 생성입니다.
다음은 이벤트 Action함수 toogleView()를 작성합니다. 함수의 역할은 infoButton을 터치했을 때 MainViewController와 FlipsideViewController사이의 화면(뷰) 전환 애니메이션등을 처리를 합니다. public void loadFlipsideViewController()
{
flipsideViewController = new FlipsideViewController();
flipsideViewController.View.Frame = new RectangleF(0.0f, 44.0f, // 뷰의 Y좌표를 네비게이션바의 위치를 고려하여 지정합니다.
flipsideViewController.View.Frame.Width,
flipsideViewController.View.Frame.Height);
navigationBar = new UINavigationBar(new RectangleF(0.0f, 0.0f, 320.0f, 44.0f));
navigationBar.BarStyle = UIBarStyle.Black;
UIBarButtonItem buttonItem = new UIBarButtonItem(UIBarButtonSystemItem.Done, delegate {
toggleView(null);
} );
UINavigationItem navigationItem = new UINavigationItem("CountMeIn");
navigationItem.RightBarButtonItem = buttonItem;
navigationBar.PushNavigationItem(navigationItem, false);
} partial void toggleView (UIButton sender)
{
Console.WriteLine("toggleView");
if(flipsideViewController == null) loadFlipsideViewController();
UIView mainView = mainViewController.View;
UIView flipsideView = flipsideViewController.View;
UIView.BeginAnimations(null); // 뷰 애니메이션 준비
UIView.SetAnimationDuration(1.0); // 애니메이션 전환 간격을 1.0초로 지정
UIViewAnimationTransition transition = (mainView.Superview != null)?UIViewAnimationTransition.FlipFromRight : UIViewAnimationTransition.FlipFromLeft;
UIView.SetAnimationTransition(transition, this.View, true); // 뷰 전환 방향과 현재 뷰에 대해서 실행 함을 지정
if(mainView.Superview != null)
{ // 1. MainViewController → FlipsideViewController
flipsideViewController.ViewWillAppear(true);
mainViewController.ViewWillDisappear(true);
mainView.RemoveFromSuperview();
infoButton.RemoveFromSuperview();
this.View.AddSubview(flipsideView);
this.View.InsertSubviewAbove(navigationBar, flipsideView);
mainViewController.ViewDidDisappear(true);
flipsideViewController.ViewDidAppear(true);
} else
{ // 2. FlipsideViewController → MainViewController
mainViewController.ViewWillAppear(true); // 화면에 나타날 뷰 지정
flipsideViewController.ViewWillDisappear(true); // 화면에서 사라질 뷰 지정
flipsideView.RemoveFromSuperview(); // 서브뷰로 등록 한 것을 삭제
navigationBar.RemoveFromSuperview(); // 서브뷰로 등록 한 것을 삭제
this.View.AddSubview(mainView); // 보여질 뷰를 서브뷰로 등록
this.View.InsertSubviewAbove(infoButton, mainView); // infoButton을 추가한 서브뷰 앞으로 추가
flipsideViewController.ViewDidDisappear(true); // 사라짐을 지정
mainViewController.ViewDidAppear(true); // 나타남을 지정
}
UIView.CommitAnimations(); // 애니메이션 실행
}UIView.BeginAnimations()와 UIView.CommitAnimations() 사이의 처리 내용은 자주 사용되는 코드입니다. flipsideViewController가 null인 경우 앞에서 정의한 함수를 호출하여 생성하도록 코드가 추가 되어 있습니다.
화면 전환의 방향은 UIViewAnimationTransition.FlipFromRight와 UIViewAnimationTransition.FlipFromLeft 값으로 지정합니다. 이외에도 지정 가능한 값이 있으니 테스트 해 보시기 바랍니다.
저장하고 컴파일 한 후 아이폰 시뮬레이터로 확인 해 봅니다.
9. 마지막으로 (+)와 (-)버튼의 이벤트 함수에 숫자를 카운트하는 코드를 추가합니다.
MainViewController.xib.cs 파일을 편집기로 블러 들입니다. 카운트 값을 보존하기 위해 정수형 멤버 변수 "count"를 추가합니다.
public partial class MainViewController : UIViewController
{
int count;
#region Constructors
...
void Initialize ()
{
count = 0; // count변수 초기화
}
...
(+)버튼의 이벤트 Action함수 addUnit()를 추가하고 count변수의 값을 증가시키는 다음 코드를 작성합니다.
partial void addUnit (UIButton sender)
{
if(count >= 999) return ;
counter.Text = String.Format("{0}", ++count);
}(-)버튼의 이벤트 Action함수 subtractUnit()를 추가하고 count변수의 값을 감소시키는 다음 코드를 작성합니다.
partial void subtractUnit (UIButton sender)
{
if(count == 0) return ;
counter.Text = String.Format("{0}", --count);
}저장 후 컴파일하여 실행시켜 각 이벤트가 정확히 동작하는지 확인 해 봅니다.

이번 예제도 앞의 예제들과 같이 간단한 화면 설계와 이벤트 처리에 대한 연습으로 크게 어렵지는 않습니다.
AppsAmuck의 6번째 예제 "Reaction Time"은 타이머와 UIAlertView, random함수의 사용에 대해서 알아보는 예제입니다. 기대해 주세요.
# by | 2009/10/15 00:13 | iPhone | 트랙백 | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]