여러 경우에 iPhone 키보드 상단에 도구 모음을 추가하고 싶습니다 (예 : 양식 요소를 탐색 할 때 iPhone Safari에서와 같이).
현재는 상수를 사용하여 툴바의 사각형을 지정하고 있지만 인터페이스의 다른 요소 (화면 상단의 툴바 및 탐색 모음)가 유동적이기 때문에 인터페이스를 약간 변경할 때마다 툴바가 정렬되지 않습니다.
현재보기와 관련하여 키보드의 위치를 프로그래밍 방식으로 결정하는 방법이 있습니까?
답변:
iOS 3.2부터이 효과를 얻을 수있는 새로운 방법이 있습니다.
UITextFields
및 UITextViews
이 inputAccessoryView
자동으로 위에 표시하고 키보드와 애니메이션 모든보기에 설정할 수있는 속성을.
사용하는 뷰는 다른 뷰 계층 구조에 있지 않아야하며 일부 수퍼 뷰에 추가해서는 안됩니다.이 작업은 자동으로 수행됩니다.
그래서 기본적으로:
init 메소드에서 :
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];
그런 다음 위에 언급 된 방법으로 막대의 위치를 조정합니다.
-(void) keyboardWillShow:(NSNotification *) note
{
CGRect r = bar.frame, t;
[[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
r.origin.y -= t.size.height;
bar.frame = r;
}
감싸서 위치 변경을 애니메이션으로 만들어 예쁘게 만들 수 있습니다.
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
//...
[UIView commitAnimations];
UIKeyboardFrameBeginUserInfoKey
같은 정보를 제공하는 것과 같은 다른 유사한 것들이 있습니다 .
UIKeyboardFrameEndUserInfoKey
키보드의 최종 프레임 (화면 좌표)을 얻으려면을 사용해야 합니다. 당신은 또한 사용할 수 UIKeyboardAnimationDurationUserInfoKey
와 UIKeyboardAnimationCurveUserInfoKey
정확히 키보드의 동작을 일치하는 데 필요한 매개 변수의 나머지 부분을 얻을 수 있습니다.
이것은 tonklon 의 기존 답변을 기반으로합니다 . 오른쪽에 "완료"버튼과 함께 키보드 상단에 반투명 검정색 도구 모음을 표시하는 코드 스 니펫을 추가하고 있습니다.
UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
[toolbar sizeToFit];
UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];
NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil];
[flexButton release];
[doneButton release];
[toolbar setItems:itemsArray];
[aTextField setInputAccessoryView:toolbar];
그리고 -resignKeyboard
다음과 같이 보입니다.
-(void)resignKeyboard {
[aTextField resignFirstResponder];
}
누군가에게 도움이되기를 바랍니다.
3.0 이상 userInfo
에서는 알림 사전 에서 애니메이션 기간과 곡선을 가져올 수 있습니다 .
예를 들어, 키보드 공간을 만들기 위해 뷰의 크기를 애니메이션하려면에 등록 UIKeyboardWillShowNotification
하고 다음과 같은 작업을 수행하십시오.
- (void)keyboardWillShow:(NSNotification *)notification
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
[UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
CGRect frame = self.view.frame;
frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
self.view.frame = frame;
[UIView commitAnimations];
}
에 대해 유사한 애니메이션을 수행 UIKeyboardWillHideNotification
합니다.
이 메서드를 만들고 ViewWillLoad에서 호출합니다.
- (void) keyboardToolbarSetup
{
if(self.keyboardToolbar==nil)
{
self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)];
UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)];
NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil];
[self.keyboardToolbar setItems:toolbarButtons];
self.myTextView.inputAccessoryView=self.keyboardToolbar;
}
}
키보드보기의 크기를 가져 오는 방법 (AFAIK)이 없습니다. 그러나 적어도 지금까지 모든 iPhone 버전에서 일정합니다.
도구 모음 위치를보기 하단에서 오프셋으로 계산하고보기 크기를 고려하면 탐색 모음이 있는지 여부에 대해 걱정할 필요가 없습니다.
예
#define KEYBOARD_HEIGHT 240 // example - can't remember the exact size
#define TOOLBAR_HEIGHT 30
toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT;
// move toolbar either directly or with an animation
정의 대신 쉽게 만들 수 있습니다. keyboardHeight
키보드가 표시되는지 여부에 따라 크기를 반환 함수를 만들고이 도구 모음 위치를 레이아웃을 재구성하는 별도의 함수로 이동할 수 있습니다.
또한 navbar 설정에 따라 뷰의 크기가로드되고 표시 될 때 변경 될 수 있으므로이 위치 지정을 수행하는 위치에 따라 달라질 수 있습니다. 나는 그것을하기에 가장 좋은 장소는 viewWillAppear 일 것이라고 믿습니다.