2009-07-28 13 views
6

किसी ने एक और सवाल में इस कोड को तैनात एक UIAlertSheet में एक UIDatePicker डाल करने के लिए:UIActionSheet में UIDatePicker लेयरिंग समस्या

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                delegate:self 
             cancelButtonTitle:@"Cancel" 
            destructiveButtonTitle:nil 
             otherButtonTitles:nil]; 

// Add the picker 
UIDatePicker *pickerView = [[UIDatePicker alloc] init]; 
pickerView.datePickerMode = UIDatePickerModeDate; 
[menu addSubview:pickerView]; 
[menu showInView:self.view];   
[menu setBounds:CGRectMake(0,0,320, 500)]; 

CGRect pickerRect = pickerView.bounds; 
pickerRect.origin.y = -100; 
pickerView.bounds = pickerRect; 

[pickerView release]; 
[menu release]; 

मैं इसे इस के लिए संशोधित किया है:

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:nil 
                 delegate:nil 
              cancelButtonTitle:@"Done" 
             destructiveButtonTitle:nil 
              otherButtonTitles:nil]; 

    // Add the picker 
    UIDatePicker *pickerView = [[UIDatePicker alloc] init]; 
    pickerView.datePickerMode = UIDatePickerModeCountDownTimer; 
    [menu addSubview:pickerView]; 
    [menu showInView:self.navigationController.tabBarController.view];   
    [menu setBounds:CGRectMake(0,0,320, 516)]; 
    [pickerView setFrame:CGRectMake(0, 85, 320, 216)]; 

यह सही ढंग से एक चेतावनी चादर पैदावार तैनात (नील प्रतिनिधि को अनदेखा करें; यह केवल प्रदर्शन उद्देश्यों के लिए है)। समस्या यहाँ निहित है:

alt text http://hosting-wizards.com/actionsheet.jpg

आप देख सकते हैं, मिनट स्क्रोलर ऊपर, वहाँ एक लेयरिंग समस्या है। अगर डिवाइस पर यह होता है तो मैंने पुष्टि नहीं की है। ऐसा कोई विचार क्यों है कि यह क्यों हो रहा है?

एक और सवाल: UIActionSheet पर सेटबाउंड चयनकर्ता के पास सही प्रदर्शन के लिए उच्च मूल्य पर वाई-आकार सेट क्यों है? वाई-आकार को 480 पर सेट करना एक पूर्ण स्क्रीन डिस्प्ले बनाना चाहिए, है ना? इस मान को शून्य पर सेट करना इसे लगभग अदृश्य बनाता है।

साइड नोट: उपरोक्त चिपकाया गया कोड UIDatePicker को उसी स्थान पर स्थिति में नहीं रखता है, जो कि चित्र में है, लेकिन लेयरिंग समस्या कोई फर्क नहीं पड़ता कि UIDatePicker कहां रखा गया है। लेयरिंग मुद्दा केवल शीर्ष पर है, न कि नीचे।

उत्तर

8

आप प्रदर्शन समस्या से बचने और एक बेहतर की तलाश में परिणाम प्राप्त अगर आप बस एक नया दृश्य में UIDatePicker रख दिया और स्लाइड उर्ध्वप्रवाह को लागू करेगा नीचे से नीचे व्यवहार करते हैं। यह इतना मुश्किल नही है।

  1. उस यूआईवी व्यू को एक दिनांक पिकर और एक टूलबार जिसमें एक पूर्ण बटन वाला बनाएं। (कोड या इंटरफ़ेस बिल्डर का उपयोग करें, इससे कोई फर्क नहीं पड़ता।)
  2. पॉपअप दृश्य को अपने मुख्य दृश्य के सबव्यूव के रूप में जोड़ें।
  3. पॉपअप दृश्य की अवधि सेट करें ताकि यह स्क्रीन के नीचे बंद है: frame.origin.y -= CGRectGetHeight(popupView.bounds)
  4. कॉल [UIView commitAnimations]

(: frame.origin.y = CGRectGetMaxY(mainView.bounds)

  • कॉल [UIView beginAnimations:nil context:nil]
  • जहां यह होना चाहिए करने के लिए अवधि सेट करें ध्यान दें कि फ्रेम सेटिंग सामान छद्म कोड है।)

    यही है। जब आपको दृश्य को खारिज करने की आवश्यकता होती है तो इसे विपरीत में करें। मुझे लगता है कि यह मुसीबत के लायक होगा; एक UIActionSheet में एक दिनांक पिकर चिपके हुए अविश्वसनीय रूप से tacky लग रहा है।

  • 1

    क्या आपको वाकई अपने पिकर को UIActionSheet पर रखना होगा? आप UIResponder क्लास से इनपुट व्यू प्रॉपर्टी का उपयोग क्यों नहीं करते? जब आपका नियंत्रण (उदा। UITextField) पहला प्रतिसादकर्ता बन जाता है तो यह स्वचालित रूप से UIDatePicker (या कोई अन्य दृश्य) दिखाता है। स्रोत कोड के साथ इनपुट व्यू का उपयोग करने का एक उदाहरण यहां पाया जा सकता है: Working with pickers

    +0

    इनपुट दृश्य आईओएस 4.0 और उच्चतम में उपलब्ध है। यदि आप 3.1 का समर्थन करना चाहते हैं तो इसका उपयोग नहीं कर सकते –

    1

    इस

    [menu sendSubviewToBack: pickerView]; 
    

    कोशिश करते हैं और यह भी 10 पिक्सल नीचे आप स्क्रीनशॉट यह नीचे करने के लिए aliged नहीं है में देखने के रूप में अपने पिकर ले जाते हैं,

    [pickerView setFrame:CGRectMake(0, 100, 320, 216)]; 
    
    3

    हो सकता है इसके बाद के संस्करण benzado के चरणों का उपयोग करना, यहाँ है मोटे तौर पर आपका कोड कैसा दिखाई देगा यदि आप एक्शनशीट के बजाय UIView का उपयोग करते हैं:

    int height = 255; 
    
    //create new view 
    UIView * newView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, 320, height)]; 
    newView.backgroundColor = [UIColor colorWithWhite:1 alpha:1]; 
    
    //add toolbar 
    UIToolbar * toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 0, 320, 40)]; 
    toolbar.barStyle = UIBarStyleBlack; 
    
    //add button 
    UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:nil]; 
    toolbar.items = [NSArray arrayWithObjects:infoButtonItem, nil]; 
    
    //add date picker 
    UIDatePicker *datePicker = [[UIDatePicker alloc] init]; 
    datePicker.datePickerMode = UIDatePickerModeDate; 
    datePicker.hidden = NO; 
    datePicker.date = [NSDate date]; 
    datePicker.frame = CGRectMake(0, 40, 320, 250); 
    [datePicker addTarget:self action:nil/*@selector(changeDateInLabel:)*/ forControlEvents:UIControlEventValueChanged]; 
    [newView addSubview:datePicker]; 
    
    //add popup view 
    [newView addSubview:toolbar]; 
    [self.view addSubview:newView]; 
    
    //animate it onto the screen 
    CGRect temp = newView.frame; 
    temp.origin.y = CGRectGetMaxY(self.view.bounds); 
    newView.frame = temp; 
    [UIView beginAnimations:nil context:nil]; 
    temp.origin.y -= height; 
    newView.frame = temp; 
    [UIView commitAnimations]; 
    

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

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