ايفون:كيفية جعل صوت النقر على لوحة المفاتيح المخصصة؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لاستدعاء صوت "النقر" على لوحة المفاتيح برمجياً؟يحتوي تطبيقي على لوحة مفاتيح مخصصة (مبنية على UIButtons) وأرغب في تقديم بعض التعليقات الصوتية عندما ينقر المستخدم على المفاتيح.لقد حاولت إنشاء الأصوات الخاصة بي في Garageband، لكنني لم أكن سعيدًا بأي من إبداعاتي.إذا لم تكن هناك طريقة قياسية لاستدعاء النقر على المفتاح، فهل يمكن لأي شخص أن يوجهني إلى مكتبة الأصوات التي قد تحتوي على مثل هذه الجوهرة؟

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

المحلول

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

نصائح أخرى

يوجد حل سريع حقًا لتشغيل صوت لوحة المفاتيح الافتراضية:

  1. إضافة AudioToolbox.framework
  2. أضف السطر التالي أينما تريد تشغيل الصوت:

    AudioServicesPlaySystemSound(0x450);

واعتبارا من دائرة الرقابة الداخلية 4.2، اعتماد بروتوكول UIInputViewAudioFeedback على فئة فرعية مخصصة من UIView. جعل هذا عرض بك "inputView" ومن ثم استدعاء "playInputClick" في الوقت المناسب.

http://developer.apple.com/library/ دائرة الرقابة الداخلية / # الوثائق / uikit / إشارة / UIInputViewAudioFeedback_ProtocolReference / المرجع / Reference.html

وفقط لانقاذ بعض الوقت الناس. وضع هذا في العرض المخصص:

- (BOOL) enableInputClicksWhenVisible {
    return YES;
}

لجعل النقر قيام بذلك:

[[UIDevice currentDevice] playInputClick];

لا حاجة لنسخ الملف إلى التطبيق الخاص بك - يجب أن تكون قادرة على الحصول عليه مباشرة من إطار UIKit:

CFURLRef soundFileURLRef = CFBundleCopyResourceURL(
    CFBundleGetBundleWithIdentifier(CFSTR("com.apple.UIKit")),
    CFSTR ("Tock"),CFSTR ("aiff"),NULL);

وهذا هو ما أدليت به للخروج منه تعليق aSquared ل:

NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound(soundID);
AudioServicesDisposeSystemSoundID(soundID);

وعن طريق 0x450 كما يعمل SystemSoundID بالنسبة لي (وفي حجم الصحيح - مجرد اللعب المدمج في Tock.aiff كان مدويا للغاية). أي فكرة عن كيفية المحمولة التي هي - وهذا هو على آي بود تاتش 3 الجنرال

ومع ذلك لا تحترم تفضيل علامة على / قبالة.

وهنا هو ما فعلته:

وحدد موقع "Tock.aiff" في: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/System/Library/Frameworks/UIKit.framework

واسحبه إلى مجلد مصادرك في كسكودي، موقوتة سلع نسخ إلى مجلد مجموعة الوجهة '

واستيراد AVFoundation.framework إلى المجلد أطر في كسكودي

واستيراد AVFoundation في الجزء العلوي من الطبقة الخاصة بك:

#import <AVFoundation/AVAudioPlayer.h>

استخدم الدالة التالية:

- (void)PlayClick {
    NSURL* musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                               pathForResource:@"Tock"
                                               ofType:@"aiff"]];
    AVAudioPlayer *click = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
    [click setVolume:0.15f];
    [click play];
}

وهذا كل شيء!

ومن ما استطيع ان اقول، انقر الصوت ليس متاحا للتطبيقات. أنا لم أر أي شيء في الخدمات جلسة الصوتية التي هي ذات الصلة. AudioServicesPlaySystemSound() تبدو واعدة، ولكن لا يبدو أن هناك أي ID نظام الصوت للصوت نقرة (نظرة فاحصة على رؤوس قد يحضر شيء). هل يمكن دائما حلقة بشأن الدعوة لAudioServicesPlaySystemSound(i) ومعرفة ما اذا كان يلعب أي شيء. برنامج اي فون استعادة الصور ربما يكون الصوت، لكنه ربما غير مرخصة للاستخدام العام. نصائح والخدع اي فون للحصول على الصوت فوق لذيذ لا ضرورة لذكرها.

ل(الإبداعي) يبدو، وتحقق من مشروع Freesound .

وبالنسبة للمستقبل، ربما يطلب أن أبل فضح نظام الأصوات غير صوت تنبيه للاستخدام مع AudioServicesPlaySystemSound().

وربما متأخرا بعض الشيء ... ولكن في MrMage آخر مشاركة، إذا كنت تفعل AudioServicesDisposeSystemSoundID(soundID); مباشرة بعد AudioServicesPlaySystemSound(soundID); ثم لن تسمع شيئا كما كنت التخلص من نظام الصوت مباشرة بعد إنشائه.

وعليك أن ندعه إنهاء اللعب لأول مرة .. فقط استدعاء AudioServicesDisposeSystemSoundID لإلغاء الصوت قبل أن ينتهي

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

وبالطبع تخلص أخيرا من وجوه SystemSoundID في dealloc.

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