프로그래밍 방식으로 iPhone 키보드 위에 도구 모음 정렬


94

여러 경우에 iPhone 키보드 상단에 도구 모음을 추가하고 싶습니다 (예 : 양식 요소를 탐색 할 때 iPhone Safari에서와 같이).

현재는 상수를 사용하여 툴바의 사각형을 지정하고 있지만 인터페이스의 다른 요소 (화면 상단의 툴바 및 탐색 모음)가 유동적이기 때문에 인터페이스를 약간 변경할 때마다 툴바가 정렬되지 않습니다.

현재보기와 관련하여 키보드의 위치를 ​​프로그래밍 방식으로 결정하는 방법이 있습니까?

답변:


142

iOS 3.2부터이 효과를 얻을 수있는 새로운 방법이 있습니다.

UITextFieldsUITextViewsinputAccessoryView자동으로 위에 표시하고 키보드와 애니메이션 모든보기에 설정할 수있는 속성을.

사용하는 뷰는 다른 뷰 계층 구조에 있지 않아야하며 일부 수퍼 뷰에 추가해서는 안됩니다.이 작업은 자동으로 수행됩니다.


나 해보자 . 그것이 최선의 방법으로 보이지만.
harshalb

와. 이 얼마나 발견! 감사합니다 (I는 어려운 방법을했고, 그것의 지저분한)
levous

1
막대 단추 항목 중 하나에 UITextField가있는 UIToolbar가 있지만 첫 번째 누를 때 해당 도구 모음에 textFields inputAccessoryView를 설정했지만 도구 모음이 올라가지 만 키보드가 나타나지 않습니다. 두 번째로 누르면 툴바와 함께 키보드가 나타납니다.
Ugur Kumru

하지만 UIWebView에 툴바를 추가하는 방법은 무엇입니까? :(
Dmitry

표준 UIWebView 도구 모음의 버튼을 대체하여 수행했습니다 (제거와 동일한 코드).
Dmitry

72

그래서 기본적으로:

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];

오늘 아침 내 오래된 물건을 샅샅이 뒤졌고 이것이 훨씬 더 좋고 가장 포괄적 인 대답이라는 것을 알았습니다. 감사!
Rob Drimmie

이 답변은 1 년 후에도 여전히 상당히 관련이 있습니다. 이와 관련된 무언가를 개발할 때 고비를 극복하는 데 도움이되었습니다.
james_womack 2010

2
이제이 질문에 걸려 넘어지는 사람들에게 경고합니다. UIKeyboardBoundsUserInfoKey는 이제 iPhone OS 3.2에서 더 이상 사용되지 않습니다. UIKeyboardFrameBeginUserInfoKey같은 정보를 제공하는 것과 같은 다른 유사한 것들이 있습니다 .
Stephen Darlington

9
iOS3.2에서 UITextField 및 UITextView의 inputAccessoryView 속성을 사용하는 더 나은 새로운 방법이 있습니다.
tonklon 2010-07-23

6
이 답변은 많은 도움이되었지만 약간 날짜가 있습니다. UIKeyboardFrameEndUserInfoKey키보드의 최종 프레임 (화면 좌표)을 얻으려면을 사용해야 합니다. 당신은 또한 사용할 수 UIKeyboardAnimationDurationUserInfoKeyUIKeyboardAnimationCurveUserInfoKey정확히 키보드의 동작을 일치하는 데 필요한 매개 변수의 나머지 부분을 얻을 수 있습니다.
Dave Peck

60

이것은 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];
}

누군가에게 도움이되기를 바랍니다.


2
다음 이전 위치에 대한 약간의 주석을 추가하는 것뿐입니다. UISegmentedControl * segmentControl = [[UISegmentedControl alloc] initWithItems : [NSArray arrayWithObjects : @ "Previous", @ "Next", nil]]; [segmentControl setSegmentedControlStyle : UISegmentedControlStyleBar]; [segmentControl addTarget : self action : @selector (nextPrevious :) forControlEvents : UIControlEventValueChanged];
Trausti 토르

1
@TraustiThor의 주석에 추가 : 세그먼트 화 된 컨트롤을 UIBarButtonItem에 래핑하여 도구 모음에 추가해야합니다.
Tim Büthe

훌륭합니다-이것이 제가 필요한 모든 코드입니다. 게시 해 주셔서 감사합니다 :)
Stretch

하지만 UIWebView는 어떻습니까? 도구 모음을 추가하는 방법은 무엇입니까?
Dmitry

24

키보드 알림 (예 :)에 등록 UIKeyboardWillShowNotification UIKeyboardWillHideNotification하면 수신되는 알림에 userInfodict ( UIKeyboardBoundsUserInfoKey) 의 키보드 경계가 포함됩니다 .

참고 항목 UIWindow클래스 참조하십시오.


16

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합니다.


3.0 SDK에서 더 나은 방법으로 게시 해 주셔서 감사합니다!
Hua-Ying

코드 주셔서 감사합니다. 이것은 많은 도움이됩니다. 그러나 내 UITextView를 viewDidLoad에서 첫 번째 응답자가되도록 설정하면 UIToolBar가 self.view의 크기 조정과 함께 이동하지 않습니다. 왜 그런지 아십니까?
RyanJM

1
@RyanJM : becomeFirstResponder 및 resignFirstResponder는보기가 화면에서 벗어날 때 이상한 동작을합니다. 대신 viewWillAppear 메서드에서 becomeFirstResponder를 호출해야합니다.
David Beck

0

이 메서드를 만들고 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;
        }
}

-3

키보드보기의 크기를 가져 오는 방법 (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 일 것이라고 믿습니다.


감사합니다! 지금까지 UIKeyboardDidShowNotification에 의해 트리거되는 선택기에서이 계산을 수행했습니다. 몇 군데에서만 테스트했지만 좋은 지점 인 것 같습니다.
Rob Drimmie

5.0부터 키보드 크기는 더 이상 고정되어 있지 않습니다.
Alastair Stuart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.