प्रोग्रामेटिक रूप से iPhone कीबोर्ड के शीर्ष पर एक टूलबार संरेखित करें


94

कई मामलों में मैं iPhone कीबोर्ड के शीर्ष पर एक टूलबार जोड़ना चाहता हूं (जैसे iPhone सफारी में जब आप तत्वों को नेविगेट कर रहे हैं, उदाहरण के लिए)।

वर्तमान में मैं स्थिरांक के साथ टूलबार की आयत को निर्दिष्ट कर रहा हूं, लेकिन क्योंकि इंटरफ़ेस के अन्य तत्व फ्लक्स में हैं - टूलबार और स्क्रीन के शीर्ष पर नौ बार - जब भी हम एक मामूली इंटरफ़ेस परिवर्तन करते हैं, टूलबार संरेखण से बाहर हो जाता है।

क्या वर्तमान दृश्य के संबंध में कीबोर्ड की स्थिति को प्रोग्रामेटिक रूप से निर्धारित करने का एक तरीका है?

जवाबों:


142

IOS 3.2 के रूप में इस प्रभाव को प्राप्त करने का एक नया तरीका है:

UITextFieldsऔर UITextViewsएक inputAccessoryViewसंपत्ति है, जिसे आप किसी भी दृश्य पर सेट कर सकते हैं, जो स्वचालित रूप से ऊपर प्रदर्शित होता है और कीबोर्ड के साथ एनिमेटेड होता है।

ध्यान दें कि आपके द्वारा उपयोग किया जाने वाला दृश्य न तो दृश्य पदानुक्रम में कहीं और होना चाहिए, और न ही आपको इसे कुछ सुपरवाइवे में जोड़ना चाहिए, यह आपके लिए किया गया है।


मुझे कोशिश करने दो । हालांकि यह सबसे अच्छा तरीका है।
हर्शल

वाह। क्या पता! धन्यवाद (मैंने इसे कठिन तरीके से किया और यह गन्दा है)
लेव्स

1
मेरे पास इसके एक बार बटन आइटम के अंदर एक UITextField के साथ एक UIToolbar है, लेकिन हालांकि मैंने textFields inputAccessoryView को उस टूलबार में पहले प्रेस टूलबार में सेट किया है, टूलबार ऊपर जाता है, लेकिन कोई कीबोर्ड दिखाई नहीं देता है। दूसरे प्रेस में कीबोर्ड दिखाई देता है टूलबार के बारे में कोई विचार है?
उगुर कुमर

लेकिन UIWebView पर टूलबार कैसे जोड़ें ?:(
दिमित्री

मैंने इसे मानक UIWebView टूलबार (इसे हटाने के लिए समान कोड) पर बटन बदलकर किया है।
दिमित्री

72

तो मूल रूप से:

इनिट विधि:

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

आज सुबह मेरे पुराने सामान को घूर रहा था और देखा कि यह बहुत बेहतर और सबसे व्यापक जवाब है। धन्यवाद!
रोब ड्रिमी जूल

यह उत्तर एक साल बाद भी काफी प्रासंगिक है। इससे संबंधित कुछ विकसित करने पर मुझे कूबड़ के ऊपर आने में मदद मिली।
james_womack

2
अभी इस सवाल पर ठोकर खा रहे लोगों के लिए एक चेतावनी: UIKeyboardBoundsUserInfoKey अब iPhone OS 3.2 में पदावनत किया गया है। अन्य, समान हैं जैसे UIKeyboardFrameBeginUserInfoKeyकि वही जानकारी देते हैं।
स्टीफन डार्लिंगटन

9
IOS3.2 में UAextField और UITextView पर inputAccessoryView संपत्ति है कि ऐसा करने के लिए एक बेहतर नया तरीका है।
१०

6
इस जवाब ने एक टन की मदद की लेकिन थोड़ा दिनांकित है। आपको UIKeyboardFrameEndUserInfoKeyकीबोर्ड के अंतिम फ्रेम (स्क्रीन कोऑर्डिनेट में) का उपयोग करना चाहिए । आप उपयोग कर सकते हैं UIKeyboardAnimationDurationUserInfoKeyऔर UIKeyboardAnimationCurveUserInfoKeyबाकी मापदंडों को प्राप्त करने के लिए आपको कीबोर्ड के व्यवहार से बिल्कुल मेल खाने की आवश्यकता है।
डेव पेक

60

यह टोनक्लोन के मौजूदा उत्तर पर आधारित है - मैं सिर्फ एक कोड स्निपेट जोड़ रहा हूं जो कीबोर्ड के ऊपर एक अर्ध पारदर्शी काले टूलबार को दिखाता है, साथ में दाईं ओर एक "किया" बटन है:

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 * sectionControl = [[UISegmentedControl आवंटन] initWithItems: [NSArray arrayWithObjects: @ "पिछला", @ "अगला", nil]]; [सेक्शनकंट्रोल सेटएसेक्टेडकंट्रोलसेंटी: यूआईसेक्टेडकंट्रोलरिल्टीबेल]; :
ट्रॉस्टी थोर

1
@ TraustiThor की टिप्पणी के अलावा: आपको इसे टूलबार में जोड़ने के लिए UIBarButtonItem में खंडित नियंत्रण को लपेटना होगा।
टिम बुथ

बहुत बढ़िया - यह मेरे लिए आवश्यक सभी कोड है। पोस्ट करने के लिए धन्यवाद :)
स्ट्रेच

लेकिन UIWebView के बारे में क्या? इसमें टूलबार कैसे जोड़ें?
दिमित्री

24

यदि आप कीबोर्ड सूचनाओं, अर्थात UIKeyboardWillShowNotification UIKeyboardWillHideNotification, आदि के लिए पंजीकरण करते हैं , तो आपके द्वारा प्राप्त की जाने वाली अधिसूचना में कीबोर्ड की सीमाएं userInfoहुकुम ( 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 एसडीके धन्यवाद पर इसे करने का एक बेहतर तरीका लगता है!
हुआ-यिंग

कोड के लिए धन्यवाद। इससे बहुत मदद मिलती है। लेकिन जब मैंने अपना UITextView पहली बार viewDidLoad में उत्तरदाता बनने के लिए सेट किया, तो UIToolBar self.view के आकार के साथ स्थानांतरित नहीं होता है। क्या आपके पास कोई विचार है?
रयानजाम

1
@RyanJM: viewFirstResponder और resignFirstResponder के बीच अजीब व्यवहार होता है, जब दृश्य ऑफ स्क्रीन होता है। आपको इसके बजाय अपने ViewWillAppear मेथड से getFirstResponder कहा जाना चाहिए।
डेविड बेक

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फ़ंक्शन बना सकते हैं जो कि कीबोर्ड प्रदर्शित होने के आधार पर आकार लौटाता है, और इस टूलबार स्थिति को एक अलग फ़ंक्शन में ले जाता है जो आपके लेआउट को पुनर्गठित करता है।

इसके अलावा यह इस बात पर निर्भर करता है कि आप यह पोजीशनिंग कहां करते हैं क्योंकि यह संभव है कि आपके व्यू का आकार आपके नेवबार सेटअप के आधार पर लोड और दिखाए जाने के बीच बदल सकता है। मेरा मानना ​​है कि ऐसा करने के लिए सबसे अच्छी जगह है व्यूप्लेयर।


यह महान काम किया, धन्यवाद! अब तक मैं यह गणना UIKeyboardDidShowNotification द्वारा ट्रिगर चयनकर्ता में कर रहा हूं। मैंने केवल कुछ स्थानों पर परीक्षण किया है, लेकिन यह एक अच्छे स्थान की तरह दिखता है।
रोब ड्रिमि

5.0 के रूप में कीबोर्ड का आकार अब स्थिर नहीं है।
एलिस्टेयर स्टुअर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.