2012-03-12 19 views
10

क्या कोई अधिसूचना है जिसे मैं सुन सकता हूं जो मुझे बताएगा कि एक आईफोन की मात्रा पर कब बदली जाएगी?आईफोन वॉल्यूम बटन ऊपर दबाएं दबाएं?

मुझे AVSystemController_SystemVolumeDidChangeNotification के बारे में पता है, लेकिन यह आवश्यक है कि अधिसूचना केवल तब चालू हो जब वॉल्यूम चालू हो गया हो, ऊपर या नीचे नहीं।

दूसरा, वॉल्यूम अप बटन दबाए जाने पर पारदर्शी दृश्य को कैसे छिपा सकता है, सिस्टम की मात्रा दिखा रहा है? कैमरा + ने इसे कार्यान्वित किया है।

उत्तर

17

इस पर कोई दस्तावेज नहीं है, लेकिन आप इस कामकाज का उपयोग कर सकते हैं। AVSystemController_SystemVolumeDidChangeNotification अधिसूचना के लिए पंजीकरण करें और MPVolumeView जोड़ें जो सिस्टम वॉल्यूम व्यू को दिखने से रोक देगा।

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, 0, 10, 0)]; 
[volumeView sizeToFit]; 
[self.view addSubview:volumeView]; 

और भूल नहीं है एक ऑडियो सत्र

AudioSessionInitialize(NULL, NULL, NULL, NULL); 
AudioSessionSetActive(true); 

शुरू करने के लिए इस मामले में, MPVolumeView उपयोगकर्ता से छिपा हुआ है।

पता चल सके कि ऊपर या नीचे मात्रा दबाया गया था, बस वर्तमान एप्लिकेशन के मात्रा

float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume]; 

हड़पने और नए मात्रा के साथ तुलना के बाद बटन सूचना कॉलबैक में दबाया गया था के रूप में

आप डॉन हैं ' टी अपने आप से यह करना चाहते हैं, वहाँ एक ड्रॉप में वर्ग GitHub

https://github.com/blladnar/RBVolumeButtons

+0

इस विधि का उपयोग करने के बारे में मैंने जो कुछ देखा है, वह यह है कि यदि मेरे पास पृष्ठभूमि में संगीत चलाने वाला एक और ऐप है (या संभावित रूप से यदि आप पहले से ही ऐप में संगीत बजा रहे थे जहां आप यह पहचान कर रहे थे), कि मैं नोटिफिकेशन प्राप्त करना बंद कर देगा और वॉल्यूम बटन बैकग्राउंड =/ – Will

+0

'[[एमपीएम्यूजिकप्लेयर कंट्रोलर एप्लिकेशन म्यूजिकप्लेयर] वॉल्यूम] में संगीत के वॉल्यूम को बदलने के लिए वापस जायेंगे।' आईओएस 7 के बाद से हटा दिया गया है। – JaredH

+0

"वॉल्यूम" संपत्ति के लिए कोई वैकल्पिक म्यूट बनाने के लिए .... – Javeed

36

में उपलब्ध है आप एक चाहते हैं n घटना आप "outputVolume" संपत्ति पर एक श्रोता रजिस्टर कर सकते हैं:

- (void)viewWillAppear:(BOOL)animated { 

    AVAudioSession* audioSession = [AVAudioSession sharedInstance]; 

    [audioSession setActive:YES error:nil]; 
    [audioSession addObserver:self 
        forKeyPath:@"outputVolume" 
         options:0 
         context:nil]; 
} 

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

    if ([keyPath isEqual:@"outputVolume"]) { 
     NSLog(@"volume changed!"); 
    } 
} 
+5

मैंने स्टैक ओवरफ्लो पर इतने सारे स्थानों को देखा है और यह ऐसा करने के लिए गैर-बहिष्कृत विधियों और तारों का उपयोग करने वाला एकमात्र ऐसा है। – ShayanK

+10

इस समाधान के साथ समस्या यह है कि अगर आउटपुट वॉल्यूम पहले से ही अधिकतम है और वे + बटन दबाते हैं, तो कॉलबैक नहीं होता है। –

+0

यह समाधान वास्तव में अच्छा है, लेकिन रे सही है :(क्या प्रोग्राम को 0 से – donmarkusi

3

मैं MPVolumeView के अंदर रखा खुद लक्ष्य/UISlider के लिए कार्रवाई जोड़कर इस समस्या का समाधान। इसलिए वॉल्यूम चेंज इवेंट्स को पकड़ना और यह निर्धारित करना संभव है कि कौन सा बटन दबाया गया था। इस दृष्टिकोण के कार्यान्वयन के साथ यहां github repo है। यह आईओएस 7 और उसके बाद के साथ ठीक काम करता है, कोई बहिष्करण चेतावनी नहीं है और ऐप्पल से कोई अस्वीकृति नहीं है।

0

मात्रा कार्रवाई भेद करने के लिए आदेश में: केवल मात्रा के बजाय के (observeValue गार्ड में)

temp != 0.5 

उपयोग

temp > 0.5 

और केवल पता लगाने के लिए वॉल्यूम कम:

temp < 0.5 

नीचे दिया गया यह समाधान मुद्रित होगा अगर वॉल्यूम ऊपर या नीचे दबाया जाता है।

import AVFoundation 
import MediaPlayer 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let volumeView = MPVolumeView(frame: CGRect.zero) 
    for subview in volumeView.subviews { 
    if let button = subview as? UIButton { 
     button.setImage(nil, for: .normal) 
     button.isEnabled = false 
     button.sizeToFit() 
    } 
    } 
    UIApplication.shared.windows.first?.addSubview(volumeView) 
    UIApplication.shared.windows.first?.sendSubview(toBack: volumeView) 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) 
    do { try AVAudioSession.sharedInstance().setActive(true) } 
    catch { debugPrint("\(error)") } 
} 

override func viewDidDisappear(_ animated: Bool) { 
    super.viewDidDisappear(animated) 
    AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume") 
    do { try AVAudioSession.sharedInstance().setActive(false) } 
    catch { debugPrint("\(error)") } 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    guard let key = keyPath else { return } 
    switch key { 
    case "outputVolume": 
     guard let dict = change, let temp = dict[NSKeyValueChangeKey.newKey] as? Float, temp != 0.5 else { return } 
     let systemSlider = MPVolumeView().subviews.first { (aView) -> Bool in 
     return NSStringFromClass(aView.classForCoder) == "MPVolumeSlider" ? true : false 
     } as? UISlider 
     systemSlider?.setValue(0.5, animated: false) 
     guard systemSlider != nil else { return } 
     debugPrint("Either volume button tapped.") 
    default: 
     break 
    } 
} 
संबंधित मुद्दे