İPhone klavyesinin üstüne bir araç çubuğunu programlı olarak hizalayın


94

Bazı durumlarda iPhone klavyesinin üst kısmına bir araç çubuğu eklemek istiyorum (örneğin, iPhone Safari'de form öğelerinde gezinirken olduğu gibi).

Şu anda araç çubuğunun dikdörtgenini sabitlerle belirtiyorum, ancak arayüzün diğer öğeleri akışta olduğu için - ekranın üst kısmındaki araç çubukları ve gezinme çubukları - her küçük bir arayüz değişikliği yaptığımızda, araç çubuğunun hizası bozulur.

Geçerli görünüme göre klavyenin konumunu programlı olarak belirlemenin bir yolu var mı?

Yanıtlar:


141

İOS 3.2'den itibaren bu etkiyi elde etmenin yeni bir yolu var:

UITextFieldsve herhangi bir görünüme ayarlayabileceğiniz, otomatik olarak yukarıda gösterilen ve klavye ile canlandırılan UITextViewsbir inputAccessoryViewözelliğe sahip olun.

Kullandığınız görünümün başka bir yerdeki görünüm hiyerarşisinde olmaması gerektiğini veya onu bazı denetimlere eklemeniz gerektiğini unutmayın, bu sizin için yapılır.


izin ver deneyeyim . En iyi şekilde görünse de.
harshalb

Vay. Ne keşif! Teşekkürler (Zor yoldan yaptım ve dağınık)
levous

1
Çubuk düğme öğesinin içinde bir UITextField bulunan bir UIToolbar'ım var, ancak textFields inputAccessoryView öğesini ilk basışta bu araç çubuğuna ayarlamama rağmen araç çubuğu yukarı çıkıyor, ancak klavye görünmüyor. İkinci basışınızda klavye belirir ve araç çubuğu ile ilgili bir fikriniz var mı?
Uğur Kumru

Ancak UIWebView'da bir araç çubuğu nasıl eklenir? :(
Dmitry

Standart UIWebView araç çubuğundaki düğmeleri değiştirerek yaptım (kaldırmakla aynı kod).
Dmitry

72

Yani temelde:

İnit yönteminde:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];

Ve sonra çubuğun konumunu ayarlamak için yukarıda belirtilen yöntemlere sahip olun:

-(void) keyboardWillShow:(NSNotification *) note
{
    CGRect r  = bar.frame, t;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
    r.origin.y -=  t.size.height;
    bar.frame = r;
}

Konum değişikliğini içine kaydırarak canlandırarak güzelleştirebilir

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];

Bu sabah eski eşyalarımı karıştırıyordum ve bunun çok daha iyi ve en kapsamlı cevap olduğunu fark ettim. Teşekkürler!
Rob Drimmie

Bu cevap, bir yıl sonra hala oldukça geçerli. Bununla ilgili bir şey geliştirirken kamburluğun üstesinden gelmeme yardımcı oldu.
james_womack

2
Şu anda bu soruyla karşılaşan kişilere sadece bir uyarı: UIKeyboardBoundsUserInfoKey artık iPhone OS 3.2'de kullanımdan kaldırıldı. UIKeyboardFrameBeginUserInfoKeyAynı bilgiyi veren benzerleri de var.
Stephen Darlington

9
İOS3.2'de bunu yapmanın daha iyi bir yolu UITextField ve UITextView üzerindeki inputAccessoryView özelliği.
tonklon

6
Bu cevap bir ton yardımcı oldu ama biraz eski. UIKeyboardFrameEndUserInfoKeyKlavyenin son çerçevesini (ekran düzenleyicilerinde) elde etmek için kullanmalısınız . Ayrıca kullanabilir UIKeyboardAnimationDurationUserInfoKeyve UIKeyboardAnimationCurveUserInfoKeytam olarak klavyenin davranışını eşleştirmek için gereken parametre dinlen.
Dave Peck

60

Bu, tonklon'dan gelen mevcut yanıta dayanmaktadır - Klavyenin üstünde yarı şeffaf siyah bir araç çubuğu ve sağda "tamamlandı" düğmesiyle birlikte gösteren bir kod parçası ekliyorum:

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

ve -resignKeyboardşuna benziyor:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}

Umarım bu birine yardımcı olur.


2
Bir sonraki öncekini yerine getirmek için küçük bir yorum ekledim. UISegmentedControl * segmentControl = [[UISegmentedControl ayırma] initWithItems: [NSArray arrayWithObjects: @ "Önceki", @ "Sonraki", nil]]; [segmentControl setSegmentedControlStyle: UISegmentedControlStyleBar]; [segmentControl addTarget: kendi kendine eylem: @selector (nextPrevious :) forControlEvents: UIControlEventValueChanged];
Trausti Thor

1
@ TraustiThor'un yorumuna bir ek: Parçalı denetimi, araç çubuğuna eklemek için bir UIBarButtonItem içine sarmalısınız.
Tim Büthe

Mükemmel - ihtiyacım olan tüm kod bu. Gönderdiğiniz için teşekkürler :)
Stretch

Peki ya UIWebView? Bir araç çubuğu nasıl eklenir?
Dmitry

24

Klavye bildirimlerine, yani UIKeyboardWillShowNotification UIKeyboardWillHideNotificationvb. Kaydolursanız, aldığınız bildirim userInfodict ( UIKeyboardBoundsUserInfoKey) içindeki klavye sınırlarını içerecektir .

UIWindowSınıf referansına bakın .


16

3.0 ve üzeri sürümlerde animasyon süresini ve eğrisini userInfobildirimlerin sözlüğünden alabilirsiniz.

örneğin, klavyeye yer açmak için görünümün boyutunu canlandırmak için kayıt olun UIKeyboardWillShowNotificationve aşağıdaki gibi bir şey yapın:

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

İçin benzer bir animasyon yapın UIKeyboardWillHideNotification.


3.0 SDK'da bunu yapmanın daha iyi bir yolu gibi görünüyor, yayınladığınız için teşekkürler!
Hua-Ying

Kod için teşekkürler. Bu çok yardımcı oluyor. Ancak, UITextView'umu viewDidLoad'da ilk yanıtlayıcı olacak şekilde ayarladığımda, UIToolBar self.view yeniden boyutlandırıldığında hareket etmiyor. neden olduğu hakkında bir fikrin var mı?
RyanJM

1
@RyanJM: olduFirstResponder ve resignFirstResponder, görünüm ekran dışındayken garip davranışlar sergiliyor. Bunun yerine viewWillAppear yönteminizden beenFirstResponder'ı çağırmalısınız.
David Beck

0

Bu yöntemi oluşturun ve ViewWillLoad'da çağırın:

        - (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

Klavye görünümünün boyutlarını almanın (AFAIK) yolu yoktur. Bununla birlikte, en azından şimdiye kadarki her iPhone sürümünde sabittir.

Araç çubuğu konumunu görünümünüzün ALT kısmından bir uzaklık olarak hesaplarsanız ve görünümünüzün boyutunu hesaba katarsanız, bir gezinme çubuğunun mevcut olup olmadığı konusunda endişelenmenize gerek kalmaz.

Örneğin

#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

Tanımlama yerine keyboardHeight, klavyenin görüntülenip görüntülenmediğine bağlı olarak boyutu döndüren bir işlevi kolayca oluşturabilir ve bu araç çubuğu konumunu düzeninizi yeniden düzenleyen ayrı bir işleve taşıyabilirsiniz.

Ayrıca, bu konumlandırmayı nerede yaptığınıza bağlı olabilir, çünkü görünümünüzün boyutu, navbar kurulumunuza bağlı olarak yüklenmek ve gösterilmek arasında değişebilir. Bunu yapmak için en iyi yerin ViewWillAppear olacağına inanıyorum.


Bu harika çalıştı, teşekkürler! Şimdiye kadar bu hesaplamayı UIKeyboardDidShowNotification tarafından tetiklenen seçicide yapıyorum. Sadece birkaç yerde test ettim ama iyi bir yer gibi görünüyor.
Rob Drimmie

5.0'dan itibaren klavye boyutu artık sabit değildir.
Alastair Stuart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.