6

पर एक अदृश्य परत है, मैंने फेसबुक जैसे साइड मेनू के साथ एक एप्लिकेशन बनाया है। मेरे पास रूट व्यू कंट्रोलर है जो स्वयं पर एक दृश्य जोड़ता है, फिर जब उपयोगकर्ता 'मेनू' बटन दबाता है तो यह दृश्य को स्लाइड करेगा ताकि आप मेनू देख सकें।UINavBar के पास अन्य बटन

मेरी समस्या यह है कि जब दृश्य पहली बार लोड होता है तो ऐसा लगता है कि यूआईएनएवीबार लगभग 20 पिक्सेल या उससे कम होना चाहिए। फिर स्वचालित रूप से (नीचे छवि थोड़ा दूर केंद्रित लग रहा है, क्योंकि यह एक मॉडल क्षैतिज फ्लिप है)

enter image description here

यह अपने आप समायोजित कर देता है और सिर्फ इतना है कि स्थिति पट्टी के नीचे ऊपर ले जाता है जब मॉडल परिवर्तन पूर्ण होने के।

enter image description here

यहाँ क्या होता है जब मैं "मेनू" बटन दबाएँ का एक स्क्रीनशॉट है। यह सही करने के लिए अधिक शीर्ष दृश्य स्लाइड

enter image description here

आप छवियों में देख सकते हैं इसके बाद के संस्करण मैं बाएँ तीर और दायां तीर फ्रेम पृष्ठभूमि लाल लिए निर्धारित किया है, ताकि मैं जहां क्लिक करने योग्य/tappable क्षेत्र देख सकते हैं है। मेरे पास एक और छवि है जिसे मैंने नीली रेखा खींची है, अगर मैं नीली रेखा या ऊपर क्लिक करता हूं तो यह दायां तीर ट्रिगर नहीं करेगा। यदि मैं बाईं ओर उसी सामान्य क्षेत्र में क्लिक करता हूं तो मेनू बटन ट्रिगर होगा। मैं इसे सिम्युलेटर और मोबाइल डिवाइस पर पुन: उत्पन्न करने में सक्षम हूं (इसलिए मैं बटन को छूने वाला वसा नहीं हूं)।

enter image description here

मुझे ऐसा लगता है कि जब नेविगेशन पट्टी कम लोड कर रहा है की तुलना में यह करने के लिए iPhone सोचता है कि यह अभी भी उस स्थिति में है, इसलिए जब मैं UIButton फ्रेम के अंदर क्लिक करें यह अभी भी मेनू ट्रिगर कर रहा है और माना जाता है तीर चयनकर्ताओं को ट्रिगर नहीं करना। यदि मैं सीधे तीर के बीच में टैप करता हूं, तो यह तीर चयनकर्ताओं को ट्रिगर करता है लेकिन छवि के बाहर बस एक छोटा सा बिट, यह तीर चयनकर्ता को ट्रिगर नहीं करेगा।

यहाँ मेरी RootViewController viewDidLoad

AppointmentViewController *appointmentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"AppointmentViewController"]; 
NSLog(@"B: %@",NSStringFromCGRect(appointmentViewController.view.frame)); 
self.navController = [[UINavigationController alloc] initWithRootViewController:appointmentViewController]; 
NSLog(@"B2: %@",NSStringFromCGRect(appointmentViewController.view.frame)); 
NSLog(@"Nav Bounds: %@",NSStringFromCGRect(self.navController.view.frame)); 
NSLog(@"Bounds: %@",NSStringFromCGRect(self.contentView.bounds)); 
self.navController.view.frame = self.contentView.bounds; 
NSLog(@"Nav Bounds2: %@",NSStringFromCGRect(self.navController.view.frame)); 
[self addShadowToMenu]; 
[self.contentView addSubview:self.navController.view]; 

RootViewController लॉग्स

2012-04-30 12:24:44.533 My-App[19929:fb03] B: {{0, 20}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] B2: {{0, 20}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Nav Bounds: {{0, 0}, {320, 480}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Bounds: {{0, 0}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Nav Bounds2: {{0, 0}, {320, 460}} 

AppointmentViewController

self.title = [dataObj.preferences objectForKey:@"appts_name_plural"]; 
self.navigationItem.title = self.title; 
dayView = [[APCalendarDayView alloc] initWithCalendarView:(APCalendarView *)self]; 
APListView = [self.storyboard instantiateViewControllerWithIdentifier:@"AppointmentListView"]; 
APListView.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 


SideMenuView *myDelegate = [[SideMenuView alloc] init]; 
[self setSideMenuDelegate:myDelegate]; 
//set the delegate's currentViewController property so that we can add a subview to this View. 
[sideMenuDelegate setCurrentViewController:self]; 

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
UIBarButtonItem *today = [[UIBarButtonItem alloc] initWithTitle:@"Today" style:UIBarButtonItemStyleBordered target:nil action:@selector(todayPressed)]; 
NSArray *appointmentNavigationItems = [[NSArray alloc] initWithObjects:@"Day",@"List",@"Month", nil]; 
navcontrol = [[UISegmentedControl alloc] initWithItems:appointmentNavigationItems]; 
[navcontrol setSegmentedControlStyle:UISegmentedControlStyleBar]; 
[navcontrol addTarget:self action:@selector(appointmentNavigationClicked:) forControlEvents:UIControlEventValueChanged]; 
[navcontrol setSelectedSegmentIndex:0]; 
UIBarButtonItem *segmentItems = [[UIBarButtonItem alloc] initWithCustomView:navcontrol]; 

NSArray *items = [NSArray arrayWithObjects:today,flexSpace,segmentItems, flexSpace, nil]; 
[appointmentToolbar setItems:items animated:NO]; 
[appointmentToolbar setAutoresizesSubviews:YES]; 


[[self.view superview] addSubview:myDelegate.view]; 
[self setViewSizeOffset:(appointmentToolbar.bounds.size.height)]; 

CalendarDayView

है

यदि मैं headerView आगे से आगे बढ़ता हूं तो यह मुझे लाल क्षेत्र में कहीं भी चुनने की अनुमति देगा और तीर चयनकर्ता ट्रिगर किया जाएगा। हालांकि, मैं इसे एप्पल कैलेंडर से मेल खाना चाहता हूं और केवल नेविगेशन बार के नीचे होना चाहता हूं।

कोई भी जानता है कि नेविगेशन बार headerView के शीर्ष भाग को टैप करने से क्यों अवरुद्ध कर रहा है? शीर्षलेख के हिस्से को साफ़ करने के लिए जो अवरुद्ध किया जा रहा है वह नीली रेखा के नीचे से ऊपर है। लाल पृष्ठभूमि के साथ UIButton फ्रेम से जुड़ी एक क्रिया है, इसलिए इसे ईवेंट को ट्रिगर करना चाहिए, हालांकि ऐसा लगता है कि नवाबार UIButton के आधे को नलियां प्राप्त करने से रोक रहा है।

+0

क्या आप पोस्ट किए गए पहले कोड स्निपेट से सामग्री दृश्य सीमाएं और एनएवी नियंत्रक फ्रेम दोनों लॉग कर सकते हैं? मानक स्ट्रिंग प्राप्त करने के लिए NSStringFromCGRect का उपयोग करें जिसे आप कंसोल पर प्रिंट कर सकते हैं। – Sam

+0

@ सैम मैंने ओपी को बाध्य लॉग – Bot

उत्तर

1

यह व्यवहार इस तथ्य के कारण है कि UIWindow नौसेना बार फ्रेम के साथ मेल खाने वाले स्पर्शों का प्रचार नहीं कर रहा है। इस व्यवहार को ओवरराइड करने का एकमात्र तरीका UIWindow को उपclass करना है और हिटटेस्ट: विधि को ओवरराइड करना है। यह आपको इस क्षेत्र में छूने का पता लगाने की अनुमति देगा, और उन्हें उपयुक्त उत्तरदाताओं को अग्रेषित करेगा।

Here एक उदाहरण प्रोजेक्ट है जो एक कस्टम UIWindow सबक्लास दिखाता है जो स्क्रीन पर किसी भी स्थान पर छूने का जवाब देगा।

+0

शामिल करने के लिए संपादित किया है क्या आप इसका उदाहरण दे सकते हैं कि यह मेरे लिए कैसे लागू होगा और मैं अपनी आवश्यकताओं के लिए इसका उपयोग कैसे करूं? – Bot

संबंधित मुद्दे