2013-09-30 10 views
8

पर प्रकाश डाला गया है मेरे पास मेरे ऐप के मुख्य दृश्य के नीचे कुछ UIButtons हैं। जब कोई उपयोगकर्ता उन्हें टैप करता है तो ये बटन अंतःक्रियात्मक रूप से हाइलाइट नहीं करते हैं लेकिन उनके लक्ष्य विधियों को हमेशा कॉल किया जाता है। मैंने पाया है कि यह यूआईबटन की हाइलाइटिंग के रास्ते में नियंत्रण केंद्र का इशारा पहचानकर्ता है। यदि मैं स्क्रीन के बीच की ओर दृश्य दृश्य को स्थानांतरित करता हूं तो सबकुछ डिज़ाइन के रूप में कार्य करता है।स्क्रीन के नीचे UIButton केवल

यहां मुद्दा यह है https://devforums.apple.com/message/865922

एक समाधान मैं लक्ष्य विधि के साथ हाथ से हाइलाइट किए गए राज्य की स्थापना की कोशिश की है के रूप में रिपोर्ट किया गया है। ऐसा लगता है कि UIButton सामान्य रूप से हाइलाइट करने की अनुमति देने का एक ही प्रभाव है।

कोई भी विचार ऐप में कहीं और दिखाई देने के लिए इन नियंत्रणों को फिर से डिजाइन किए बिना कैसे काम करता है?

शायद मैं मानक दृश्य का उपयोग करता हूं और हाथ से स्पर्श बातचीत के लिए सभी विधियों को जोड़ता हूं? मुझे यह कैसे करना है? क्या यह खोज के लायक भी है?

+0

बटन कभी-कभी उस पर प्रकाश डालने पर बटन को हाइलाइट नहीं करते हैं? और "कंट्रोल सेंटर के" इशारा पहचानकर्ता द्वारा आपका क्या मतलब है। क्या आपका मतलब है 'अंतर्निहित इशारा पहचानकर्ता' बटन? – bilobatum

+0

मैंने अपना प्रश्न संपादित कर लिया है। जब उपयोगकर्ता स्क्रीन के निचले हिस्से में एक बटन टैप करता है तो यह केवल अंतःस्थापित हो जाता है। यह हाइलाइटिंग को अवरुद्ध करने वाले नियंत्रण केंद्र को लाने के लिए आरक्षित स्वाइप जेश्चर के कारण है। –

+0

क्या आपने बटन के साथ UIControlState का चयन करने की कोशिश की है। चयन = हाँ? –

उत्तर

4

मुझे इसके लिए एक बहुत ही सरल कामकाज मिला है। मानक गुणों का उपयोग करना जैसे। हाइलाइट किया गया = हाँ और। चयनित = हाँ उस निचले बैंड के भीतर काम नहीं कर रहा है। हाइलाइट किए गए राज्य को सेट करने के बजाय, मैंने अंतिम विधि को कॉल करने से पहले एक असुरक्षित देरी के साथ हाइलाइट किए गए राज्य पर बटन की पृष्ठभूमि छवि सेट की है।

[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 
[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateHighlighted]; 
[self.stopRecordingButton addTarget:self action:@selector(stopRecordingDelay) forControlEvents:UIControlEventTouchUpInside]; 

-(void)stopRecordingDelay 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateNormal]; 

    [self performSelector:@selector(stopRecording) withObject:nil afterDelay:0.025f]; 
} 

- (void)stopRecording 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 

    //Do real stuff 
} 
3

मैं हाल ही में एक ही समस्या में पड़ गए और एक जवाब के लिए हर जगह खोज करते हैं। इसी से मेरा काम बना है। यह दो चीजों का संयोजन था, UINavigationController वापस स्वाइप जेश्चर और iOS 7 नियंत्रण केंद्र इशारा (स्क्रीन के नीचे से स्वाइप करें)।

अगर एक UINavigationController पर वापस कड़ी चोट इशारा अक्षम करें:

viewDidLoad में:

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
    self.navigationController.interactivePopGestureRecognizer.enabled = NO; 
} 

सेट केवल करने के लिए नियंत्रण केंद्र इशारा दिखाने के एक अप बजाय नियंत्रण केंद्र पहले दिखाने का तीर। आप नीचे दिए गए UIViewController विधि अधिभावी करके ऐसा कर सकते:

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

आशा इस मदद करता है!

+1

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

1

मैंने इस समस्या के लिए एक फ़िक्स पोस्ट किया है जो इस question में वर्णित हाइलाइट वापस लाता है। हाइलाइट यूआईबटन और ओवरराइडिंग पॉइंट इनसाइड द्वारा तय किया गया है: टच इवेंट

+0

ऊपर उल्लिखित समाधान "सेटिंग राज्य छवि हाइलाइट किया गया" अच्छा लगता है। लेकिन, इस टिप्पणी में उल्लिखित थ्रेड में प्रदान किया गया समाधान सही लगता है। – satish

0

यदि आपके पास स्क्रीन के पूरे तल को कवर करने वाला एक बटन है तो आप एक ऐसे मुद्दे में भाग सकते हैं जहां केवल बाएं भाग में देरी हो।

आदेश पूरे बटन एक निम्न समाधान
उपयोग कर सकते हैं के लिए प्रतिक्रिया समय को सामान्य बनाने में (हारून Shekey के के एक उन्नत संस्करण):

NSDate *touchDownTime; 

- (void)touchDown 
{ 
    self.alpha = 0.7; 
    touchDownTime = [NSDate date]; 
} 

- (void)touchUpInside 
{ 
    // basically at least 80ms feedback is guaranteed this way 
    // note: timeIntervalSinceNow returns negative 
    NSTimeInterval feedbackTimeLeftToShow = 
     MAX(0.08 + [touchDownTime timeIntervalSinceNow], 0.001); 
    [self performSelector:@selector(touchUpInsideAfterFeedback) 
      withObject:nil 
      afterDelay:feedbackTimeLeftToShow]; 
} 

- (void)touchUpInsideAfterFeedback 
{ 
    self.alpha = 1; 
} 

ध्यान दें: performSelector नकारात्मक देरी मूल्यों के साथ अच्छी तरह से कर सकते हैं, लेकिन माफ की तुलना में बेहतर सुरक्षित