로그인 창을 구성할 경우에, 키보드가 나오면서 로그인 UITextField영역을 덮어 버리는 경우가 있다. 이 경우 화면설계를 할 때 하단에 키보드가 나왔을 때의 영역을 고려해서 로그인 텍스트 필드를 배치하는 경우도 있다.하지만, 임시방편일 뿐이고, 보다 근본적인 방법으로 키보드가 나올 때 해당 UIView를 위로 올렸다가 키보드가 사라질 때 그걸 내리는 방법으로 구현해야 한다.

이 방법을 좀 더 세부적으로 보면
1. UIKeyboard가 나타나는 이벤트를 감지했을 때
2. 키보드 아래쪽의 UIView영역을 키보드 높이 만큼 위로 이동시킨다.
3. 키보드 입력이 모두 끝나, 키보드 닫는 이벤트가 나왔을 때
4. 키보드를 사라지게 만드면서, UIView를 원래의 위치로 내린다.

구현을 위해서,

먼저 UIKeyboardWillShowNotification 이벤트가 발생할 때, keyboardWillShow 메소드를 호출하도록 등록한다.
- (void)loadView
{    
    [super loadView];    
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:self.view.window];
}
keyboardWillShow 메소드는 다음과 같은 형태이다.

- (void)keyboardWillShow:(NSNotification *)notif
{
    // The keyboard will be shown. If the user is editing the author, adjust the display so that the
    // author field will not be covered by the keyboard.
    if ( [[self userIDTextField] isFirstResponder] && self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if ( [[self userIDTextField] isFirstResponder] && self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}



해당 notification이 발생했을 때 위 메소드가 실행되고, 
키보드의 상태에 따라서 View를 올릴지 내릴지 애니메이션을 시켜주는 setViewMovedUp 메소드를 호출해준다.

- (void)setViewMovedUp:(BOOL)movedUp
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    // Make changes to the view's frame inside the animation block. They will be animated instead
    // of taking place immediately.
    CGRect rect = self.view.frame;
    if (movedUp)
    {
        // If moving up, not only decrease the origin but increase the height so the view 
        // covers the entire screen behind the keyboard.

        rect.origin.y -= kOFFSET_FOR_KEYBOARD;
        rect.size.height += kOFFSET_FOR_KEYBOARD;

    }
    else
    {
        // If moving down, not only increase the origin but decrease the height.
        rect.origin.y += kOFFSET_FOR_KEYBOARD;
        rect.size.height -= kOFFSET_FOR_KEYBOARD;
    }
    self.view.frame = rect;
    [UIView commitAnimations];
}



UIView의 애니메이션을 어떻게 시키는지 보여주는 메소드이다.


마지막으로 키보드 작업이 끝났을 때에 키보드를 내려주도록 textFieldDidEndEditing 메소드를 구현해주도록 하자.

- (void)textFieldDidEndEditing:(UITextField *)myTextField;
{
    if( self.view.frame.origin.y < 0 )
    {
        [self setViewMovedUp:NO];
    }
}


이제 키보드가 나타날 때 그 아래의 뷰도 함께 이동시킬 수 있게 되었다.

출처 :  http://alanduncan.net/old/index.php?q=node/13

'개발 > iOS' 카테고리의 다른 글

[iOS] XCode gloss effect 없애기  (0) 2012.03.24
[iOS] UITableView Cell 변경 animation  (0) 2011.04.29
[IOS] image size  (0) 2010.11.28
[XCODE] Breakpoint가 안먹을 때  (0) 2010.11.28
[XCODE] 메모리 관리 규칙  (0) 2010.11.16
Posted by 나랑살자
,

[IOS] image size

개발/iOS 2010. 11. 28. 01:23
tabbar image size 
- document 30 x 30 
- best size 48 x 32

icon.png 57 x 57

'개발 > iOS' 카테고리의 다른 글

[iOS] UITableView Cell 변경 animation  (0) 2011.04.29
[IOS] KEYBOARD 화면 이동  (0) 2010.12.13
[XCODE] Breakpoint가 안먹을 때  (0) 2010.11.28
[XCODE] 메모리 관리 규칙  (0) 2010.11.16
[XCODE] Redefine NSLog  (0) 2010.11.16
Posted by 나랑살자
,
Pereferences - Debugging 탭에서 'Load symbols lazily' 옵션을 꺼주면 된다.

'개발 > iOS' 카테고리의 다른 글

[IOS] KEYBOARD 화면 이동  (0) 2010.12.13
[IOS] image size  (0) 2010.11.28
[XCODE] 메모리 관리 규칙  (0) 2010.11.16
[XCODE] Redefine NSLog  (0) 2010.11.16
[XCODE] DEBUGING 팁  (0) 2010.11.16
Posted by 나랑살자
,

[XCODE] Redefine NSLog

개발/iOS 2010. 11. 16. 17:51
x#ifdef DEBUG
    #define NSLog(fmt, ...) NSLog((@"%s[Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
    #define NSLog(...)
#endif

'개발 > iOS' 카테고리의 다른 글

[IOS] image size  (0) 2010.11.28
[XCODE] Breakpoint가 안먹을 때  (0) 2010.11.28
[XCODE] 메모리 관리 규칙  (0) 2010.11.16
[XCODE] DEBUGING 팁  (0) 2010.11.16
[IOS] Core Data에서 SQLite 사용하기  (0) 2010.11.01
Posted by 나랑살자
,

[XCODE] DEBUGING 팁

개발/iOS 2010. 11. 16. 17:48
요즘 Xcode를 만져보고 있는데, 어렵긴 어렵다. 스타일이라고 해야할지 접근 방식이라고 해야할지 모르겠지만 환경 자체가 너무나 이질적인지라 .. 쓰다보니 디버깅 관련된걸 메모해둬야 할 것 같아서 몇 가지 적어본다 (사실 요즘 보고 있는 책에 나오는 내용이긴 하지만;)


- 좀비 객체 만들기 ; 
객체를 미리 해제하는 코드에서 오류가 발생할 경우, 문제의 개체를 좀비 상태로 만들어 해제를 막고 객체의 상태를 체크할 수 있다. 이는 실행 파일 설정을 변경해야 하는데, Executable Info의 Arguments 탭에서 다음 환경 변수를 추가한다 :
NSZombieEnabled=YES
CFZombieLevel=16

- NSAssert 해제 ;
NSAssert의 검증을 막으려면 Project/Build Info의 Build 탭에서 설정을 추가하면 된다. GCC 4.0 - Preprocessing 하단의 Preprocessor Macros에 NS_BLOCK_ASSERTIONS를 정의하면 된다.
(어째서 이걸 '정의'해야 Assert의 검증을 'Block'하는건지... 이게 GCC 스타일인가?;)

- 예외 발생시 브레이크 포인트 걸기 ;
XCode에서는 디버깅 시 예외가 발생했을 때 자동으로 예외가 발생한 행에서 브레이크포인트가 걸리지 않는다. (그러니까 대체 왜!) Breakpoints 창을 열어서 objc_exception_throw 심볼릭 브레이크포인트를 추가해야 한다.
참고로 malloc_error_break는 alloc이 실패할 때 발생하는 듯 ... 하지만 왜 이건 애플 레퍼런스 라이브러리에도 안 나오는지가 미스테리. 뭐지?

'개발 > iOS' 카테고리의 다른 글

[IOS] image size  (0) 2010.11.28
[XCODE] Breakpoint가 안먹을 때  (0) 2010.11.28
[XCODE] 메모리 관리 규칙  (0) 2010.11.16
[XCODE] Redefine NSLog  (0) 2010.11.16
[IOS] Core Data에서 SQLite 사용하기  (0) 2010.11.01
Posted by 나랑살자
,
1. 준비

Z_METADATA
- Z_VERSION: PRIMARY KEY, INTEGER
- Z_UUID: VARCHAR(255)
- Z_PLIST: BLOB

CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB)


Z_PRIMARYKEY
- Z_ENT: PRIMARY KEY, INTEGER
- Z_NAME: VARCHAR
- Z_SUPER: INTEGER
- Z_MAX: INTEGER

CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER)

INSERT INTO Z_PRIMARYKEY (Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES ()


- Table 이름은 ‘Z’ prefix를 붙인다. 
(실제 Core Data의 table 이름에는 Z가 없다)

- 모든 field도 Z로 시작해야 한다. 
(Core Data에서는 app schema가 ‘name’이라는 attribute를 가져도 SQLite에서는 ‘Zname’으로 field로)

- 다음 세 field를 가져야 한다.
Z_PK: PRIMARY KEY, INTEGER
Z_ENT: INTEGER
Z_OPT: INTEGER













'개발 > iOS' 카테고리의 다른 글

[IOS] image size  (0) 2010.11.28
[XCODE] Breakpoint가 안먹을 때  (0) 2010.11.28
[XCODE] 메모리 관리 규칙  (0) 2010.11.16
[XCODE] Redefine NSLog  (0) 2010.11.16
[XCODE] DEBUGING 팁  (0) 2010.11.16
Posted by 나랑살자
,