2011-08-08 11 views
5

क्या UIModalPresentationPageSheet के कोने पर एक बटन जोड़ने का कोई तरीका है? मेरा मतलब है, मैं पेज शीट के कोने पर उस ऐप्पल की तरह (एक्स) बटन रखना चाहता हूं, लेकिन इसे मूल दृश्य में जोड़ना इसे पेज शीट (और टैप करना असंभव) के पीछे दिखाई देता है और इसे पृष्ठ पर जोड़ता है शीट इसका हिस्सा छुपाएगी, क्योंकि यह दृश्य क्षेत्र से बाहर है।UIModalPresentationPageSheet कोने में बंद करें बटन

क्या कोई समाधान है?

धन्यवाद।

+0

क्या आप "पृष्ठ शीट में जोड़कर इसका हिस्सा छिपा कर देगा, क्योंकि यह दृश्य क्षेत्र से बाहर है।" से क्या मतलब है? –

उत्तर

1

यहां एक समाधान है जिसका मैं उपयोग करता हूं। यह काफी कुछ नहीं है जो आप वर्णन करते हैं, जो भी साफ होगा, लेकिन यह मुश्किल होगा क्योंकि आप चाहते हैं कि बटन आंशिक रूप से दृश्य की सीमाओं से बाहर हो (जैसा कि आप कहते हैं, इसे दृश्य-नियंत्रक का बच्चा होना होगा- देखें पर्यवेक्षण)।

मेरा समाधान नेविगेशन बार के बाएं-बटन क्षेत्र में एक करीबी बटन डालना है। मैं इसे UIViewController क्लास एक्सटेंशन के माध्यम से स्वचालित रूप से करता हूं। इसका उपयोग करने के लिए, बस [currentViewController presentAutoModalViewController: modalViewController एनिमेटेड: YES] पर कॉल करें;

@implementation UIViewController (Modal) 

- (void) presentAutoModalViewController: (UIViewController *) modalViewController withDismissAction: (SEL) onDismiss animated:(BOOL)animated 
{ 
    UINavigationController* nc = nil; 
    if (NO == [ modalViewController isKindOfClass: [UINavigationController class]]) 
    { 
     nc = [[[UINavigationController alloc] initWithRootViewController: modalViewController] autorelease]; 

     [nc setToolbarHidden:YES animated: NO]; 

     nc.modalPresentationStyle = modalViewController.modalPresentationStyle; 

     modalViewController.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                               target:self 
                               action:onDismiss] autorelease]; 
    } 
    else 
    { 
     nc = (UINavigationController*) modalViewController; 

     UIViewController* rootViewController = [nc.viewControllers objectAtIndex: 0]; 
     rootViewController.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                               target:self 
                               action:onDismiss] autorelease]; 
    } 

    [nc setNavigationBarHidden: NO]; 
    nc.navigationBar.barStyle = UIBarStyleBlack; 
    nc.toolbar.barStyle = self.navigationController.navigationBar.barStyle; 

    [self presentModalViewController: nc animated: animated ]; 
} 

- (void) presentAutoModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated 
{ 
    [self presentAutoModalViewController:modalViewController withDismissAction: @selector(autoModalViewControllerDismiss:) animated: animated]; 
} 

- (void) autoModalViewControllerDismiss: (id)sender 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (BOOL) isAutoModalViewController 
{ 
    return (self.navigationController != nil && self.navigationController.parentViewController != nil && self.navigationController.parentViewController.modalViewController == self.navigationController); 
} 

@end 
0

संपादित करें: दरअसल, पहली बात यह है कि मैं आपको सुझाव दूंगा कि एक अलग तरह का बंद बटन उपयोग करें। उदाहरण के लिए, आप Done बटन के साथ शीर्ष पर एक टूलबार जोड़ सकते हैं।

यदि आप अभी भी ऐप्पल-शैली फ़्लोटिंग एक्स चाहते हैं, तो यह सुनिश्चित करने के लिए गुणों को सेट करने का प्रयास करें कि यह छिपी हुई या क्लिप न हो। मैं कहूंगा कि ऐसा करने का बेहतर तरीका एक अग्रभूमि छवि के साथ UIButton बनाना होगा, जो कि स्टाइल बटन छवि है, और एक पृष्ठभूमि छवि जो पेज शीट के पृष्ठभूमि रंग/पैटर्न से बटन के चारों ओर एक पारदर्शी पृष्ठभूमि में फीका है। यह प्रभावी रूप से आपको पृष्ठ शीट की सीमाओं के बाहर जाने के बिना "फ़्लोटिंग क्लोज़ बटन" देता है।

+1

क्लिप टूबाउंड का पेज शीट के अंदर प्रदर्शित दृश्य पर कोई प्रभाव नहीं पड़ता है क्योंकि यह पेज शीट की सीमाओं से आगे नहीं बढ़ा सकता है। –

0

मुझे @ टॉमस्विफ्ट का सुझाव बहुत उपयोगी पाया गया। यहां एक ऐसा संस्करण है जो गैर-बहिष्कृत आईओएस 7 विधियों और एआरसी का उपयोग करता है।

@implementation UIViewController (Modal) 

- (void)presentAutoModalViewController: (UIViewController *) modalViewController withDismissAction:(SEL) onDismiss animated:(BOOL)animated 
{ 
    UINavigationController* nc = nil; 
    if (NO == [ modalViewController isKindOfClass: [UINavigationController class]]) 
    { 
     nc = [[UINavigationController alloc] initWithRootViewController: modalViewController]; 
     [nc setToolbarHidden:YES animated: NO]; 
     nc.modalPresentationStyle = modalViewController.modalPresentationStyle; 

     modalViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                               target:self 
                               action:onDismiss]; 
    } 
    else 
    { 
     nc = (UINavigationController*) modalViewController; 

     UIViewController* rootViewController = [nc.viewControllers objectAtIndex: 0]; 
     rootViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
                              target:self 
                              action:onDismiss]; 
    } 

    [nc setNavigationBarHidden: NO]; 
    nc.navigationBar.barStyle = UIBarStyleBlack; 
    nc.toolbar.barStyle = self.navigationController.navigationBar.barStyle; 

    [self presentViewController:nc animated:animated completion:nil]; 
} 

- (void)presentAutoModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated 
{ 
    [self presentAutoModalViewController:modalViewController withDismissAction: @selector(autoModalViewControllerDismiss:) animated: animated]; 
} 

- (void)autoModalViewControllerDismiss: (id)sender 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (BOOL)isAutoModalViewController 
{ 
    return (self.navigationController != nil && self.navigationController.parentViewController != nil && self.navigationController.parentViewController.presentedViewController == self.navigationController); 
} 

@end 

और मुझे यह पसंद फोन ...

MyController *vc = [[MyController alloc] init]; 
vc.modalPresentationStyle = UIModalPresentationFormSheet; 
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentAutoModalViewController:info animated:YES]; 
संबंधित मुद्दे