قم بمحاذاة شريط الأدوات الموجود أعلى لوحة مفاتيح iPhone برمجيًا

StackOverflow https://stackoverflow.com/questions/158574

سؤال

في العديد من الحالات، أرغب في إضافة شريط أدوات إلى الجزء العلوي من لوحة مفاتيح iPhone (كما هو الحال في iPhone Safari عند التنقل في عناصر النموذج، على سبيل المثال).

أقوم حاليًا بتحديد مستطيل شريط الأدوات باستخدام الثوابت، ولكن نظرًا لأن العناصر الأخرى للواجهة في حالة تغير مستمر - أشرطة الأدوات وأشرطة التنقل في الجزء العلوي من الشاشة - في كل مرة نقوم فيها بإجراء تغيير بسيط في الواجهة، يخرج شريط الأدوات عن المحاذاة.

هل هناك طريقة لتحديد موضع لوحة المفاتيح برمجيًا بالنسبة للعرض الحالي؟

هل كانت مفيدة؟

المحلول

واعتبارا من دائرة الرقابة الداخلية 3.2 هناك طريقة جديدة لتحقيق هذا الغرض:

وUITextFields وUITextViews ديك خاصية inputAccessoryView، والتي يمكن أن يحدد إلى أي وجهة نظر، التي يتم عرضها تلقائيا أعلاه والرسوم المتحركة مع لوحة المفاتيح.

لاحظ أن طريقة العرض التي تستخدم يجب أن لا يكون في نظر التسلسل الهرمي في أي مكان آخر، ولا يجب إضافته إلى بعض superview، ويتم ذلك بالنسبة لك.

نصائح أخرى

وذلك في الأساس:

في طريقة الحرف الأول:

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

ويستند هذا على الجواب موجود من 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];
}

وعلى أمل أن يساعد شخص ما.

إذا قمت بالتسجيل لإخطارات لوحة المفاتيح، أي UIKeyboardWillShowNotification UIKeyboardWillHideNotification، وما إلى ذلك، وإخطار تتلقى سوف تحتوي على حدود لوحة المفاتيح في ديكت userInfo (UIKeyboardBoundsUserInfoKey).

وانظر المرجع الطبقة UIWindow.

في 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) للحصول على أبعاد عرض لوحة المفاتيح. غير أنه مستمر، على الأقل في كل إصدار فون حتى الآن.

إذا كنت تحسب موقف شريط الأدوات كما إزاحة من الجزء السفلي من وجهة نظركم، وأخذ حجم وجهة نظركم في الاعتبار، ثم يجب أن لا داعي للقلق إذا كان نافبار موجودا أم لا.

ومنها مثلا.

#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 أن يعود حجم استنادا إلى ما إذا كان يتم عرض لوحة المفاتيح، ونقل هذه الأدوات لتحديد المواقع في وظيفة منفصلة أن تعيد ترتيب التصميم الخاص بك.

وكما أنه يمكن أن تعتمد على المكان الذي يفعل هذا لتحديد المواقع كما أنه من الممكن حجم وجهة نظركم قد تتغير بين يتم تحميل وأظهرت القائمة على إعداد شريط التنقل. وأعتقد أن أفضل مكان للقيام بذلك سيكون في viewWillAppear.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top