'속성'에 해당되는 글 1건

  1. 2010.06.22 [Objective-C] AutoSize 속성
아이폰어플개발정보2010. 6. 22. 09:55
[Objective-C] AutoSize 속성
아이폰에서 AutoSize속성을 사용하면 중력센서를 사용하여 기기 회전에 따른 처리를 할 수 잇다.
클래스명ViewController.m에서 shouldAutorotateTointerfaceorientation이라는 메소드를 주석을 풀고 오버라이딩 해 주면 된다. 해당 메소드에는 이미 기본적인 처리방법을 제공하고 있다.

시스템은 특정 방향으로 회전해도 좋은지를 이 메소드를 사용해서 뷰 컨트롤러에게 물어본다. 아이폰을 들고 있는 방향에 따라 일반적으로 4가지 방식으로 응답할 수 있는데, 그에 맞게 방향또한 4가지로 정의되어 있다.

UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight

아이폰 방향이 새방향으로 바뀌면 현재 뷰 컨트롤러의 이 메서드를 호출한다. interfaceOrientation 매개변수는 위의 목록 4가지중 1개의 값을 갖는다. 이 메소드는 새 방향에 맞게 애플리케이션 윈도우가 회전해야 하는지를 알려주기 위해 YES 혹은 NO를 리턴한다.
모든 뷰 컨트롤러의 하위 클래스가 이 방식을 각기 다르게 구현하기 때문에 한 애플리케이션에서 몇개의 뷰에서 자동회전을 지원할 수는 있지만 모든 뷰에 적용할 수는 없다.

이 메소드의 기본구현은 interfaceOrientation을 바라보게 되고 기본적으로 UIInterfaceOrientationPortrait방향에서만 YES를 리턴하게 된다. 이러한 방식으로 애플리케이션 방향을 제한하고 나머지 방향에서는 회전을 사용하지 않는다.
모든 방향에서 회전을 허용하려면 어떤 값이 전달되든지 YES를 리턴하도록 메소드를 변경하면 된다.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

모든 방향을 지원하지 않고 특정 방향만 지원하고 싶다면 interfaceOrientation의 값을 조사해서 지원 하고 싶은 방향에서만 YES를 아니라면 NO를 리턴하면 된다.
예를들어 가로보기 모두를 지원하고 세로보기 거꾸로 뒤집기를 지원하고 싶지 않다면 다음과 같이 구현한다.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

회전할때 뷰를 재구성 해보도록 하자. View-based Application으로 새로운 프로젝트를 시작한다. 프로젝트 명은 Autosize로 하고 프로젝트를 시작하게 되면 기본적인 세팅이 완료된다.
이제 resource를 클릭하여 AutosizeViewController.xib를 클릭하여 인터페이스 빌더를 실행한다.
이와 같이 화면 구성을 만들어 둔다.
 
기본적인 사이즈는 다음과 같다. 가로 125, 세로 125로 적당한 위치에 가이드에 맞춰서 배치해 준다.
AutosizeViewController.h

#import <UIKit/UIKit.h>

@interface AutosizeViewController : UIViewController {
UIButton *button1;
UIButton *button2;
UIButton *button3;
UIButton *button4;
UIButton *button5;
UIButton *button6;
}

@property (nonatomic, retain) IBOutlet UIButton *button1;
@property (nonatomic, retain) IBOutlet UIButton *button2;
@property (nonatomic, retain) IBOutlet UIButton *button3;
@property (nonatomic, retain) IBOutlet UIButton *button4;
@property (nonatomic, retain) IBOutlet UIButton *button5;
@property (nonatomic, retain) IBOutlet UIButton *button6;

@end
 
헤더파일에서 UIButton을 선언해 준다음에 각각의 아웃렛을 설정해 준다. 이는 인터페이스 빌더에서 각각의 버튼에 연결될 것이다.
 
AutosizeViewController.m

#import "AutosizeViewController.h"

@implementation AutosizeViewController

@synthesize button1;
@synthesize button2;
@synthesize button3;
@synthesize button4;
@synthesize button5;
@synthesize button6;


-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation        == UIInterfaceOrientationPortraitUpsideDown){
button1.frame = CGRectMake(20, 20, 125, 125);
button2.frame = CGRectMake(175, 20, 125, 125);
button3.frame = CGRectMake(20, 168, 125, 125);
button4.frame = CGRectMake(175, 168, 125, 125);
button5.frame = CGRectMake(20, 315, 125, 125);
button6.frame = CGRectMake(175, 315, 125, 125);
}else {
button1.frame = CGRectMake(20, 20, 125, 125);
button2.frame = CGRectMake(20, 155, 125, 125);
button3.frame = CGRectMake(177, 20, 125, 125);
button4.frame = CGRectMake(177, 155, 125, 125);
button5.frame = CGRectMake(328, 20, 125, 125);
button6.frame = CGRectMake(328, 155, 125, 125);
}

}
 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.button1 = nil;
self.button2 = nil;
self.button3 = nil;
self.button4 = nil;
self.button5 = nil;
self.button6 = nil;
[super viewDidUnload];
}


- (void)dealloc {
[button1 release];
[button2 release];
[button3 release];
[button4 release];
[button5 release];
[button6 release];
    [super dealloc];
}

@end


실제적인 구현부로 버튼들에 대한 synthesize 가 버튼 6개 모드 할당되었다.
회전시에 버튼을 이동시키려면 willAnimateSecondHalfOfRotationFrominterfaceOrientation:duration 메소드를 재정의 해야 한다. 이 메소드는 회전이 일어나면 마지막 애니메이션 동작 전에 호출된다.
버튼과 같은 모든 컨트롤들을 포함해서, 모든 뷰의 크기와 위치가 CGRect 타입의 구조체인 frame이라는 속성에 명시되어 있다. CGRectmake는 CGRect를 쉽게 만들기 위한 애플이 제공하는 함수로서 x, y, 넓이, 높이를 명시하면 CGRect 구조체를 만들어 준다.
CG는 코어 그래픽스 프레임워크라는 이름에서 따온 CG이다. 이름에서 유추할 수 잇듯이 코어 그래픽스 프레임워크는 그래픽스와 드로잉에 관련된 코드들을 제공한다.
 
이제 인터페이스 빌더에서 각각의 아웃렛을 연결하여 준다.
 
 
 
해당하는 버튼의 아웃렛으로 연결하여 주면 모든것은 끝나게 된다.
이제 시뮬레이터로 실행해보면 애니메이션 되는것을 볼 수 있다.
 
 
 
회전하는 방법은 Command + 좌우 방향키로 회전하거나 시뮬레이터 메뉴에서 Hardware 메뉴의 Rotate Left 나 Rotate Right로 할수 있다.
 


출처 : http://blog.naver.com/PostView.nhn?blogId=khagaa&logNo=30086441044

'아이폰어플개발정보' 카테고리의 다른 글

과제A - Hello Stanford 찍어보기  (0) 2010.06.22
[Objective-C]Autosize 2번째  (0) 2010.06.22
[Objective-C] AutoSize 속성  (0) 2010.06.22
[ObjectiC]액션시트, 경고창  (0) 2010.06.22
[Objective-C] 태그  (0) 2010.06.22
[Objective-C] 아웃렛  (0) 2010.06.22
Posted by 오늘마감

댓글을 달아 주세요