2012-08-25 10 views
5

के लिए रोटेशन पता लगाने के लिए मैं एक UIView है कि प्रोग्राम के रूप में बनाया जा रहा है:कैसे एक प्रोग्राम के द्वारा जनित UIView

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; 
    if (self) { 
     self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.5]; 

     UIImageView* closeButton = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"modal_close.png"]]; 

     closeButton.frame = CGRectMake(self.frame.size.width*.89, self.frame.size.height*.09, closeButton.frame.size.width, closeButton.frame.size.height); 

     UIButton* button = [[UIButton alloc] initWithFrame:CGRectMake(self.frame.size.width*.89, self.frame.size.height*.09,20, 20)]; 

     [button addTarget:self action:@selector(close) forControlEvents:UIControlEventTouchUpInside]; 

     UIView* mainView = [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width*.1,self.frame.size.height*.1,self.frame.size.width*.8,self.frame.size.height*.8)]; 

     mainView.backgroundColor = [UIColor whiteColor]; 
     _displayMainView = mainView;   

     [self addSubview:_displayMainView]; 
     [self addSubview:closeButton]; 
     [self addSubview:button]; 

     mainView = nil; 
     closeButton = nil; 
    } 
    return self; 
} 

मैं रोटेशन कैसे पता लगा सकते हैं? यह किसी अन्य मौजूदा दृश्य के शीर्ष पर एक मॉडल के रूप में कार्य करना है। यह एक आईपैड केवल ऐप है, अगर यह मायने रखता है।

+0

आप रोटेशन की UIView के कोण, या उपकरण के ओरिएंटेशन मतलब है? –

+0

इस उत्कृष्ट उत्तर को देखें - http://stackoverflow.com/a/3897243/194544 – beryllium

उत्तर

5

मुझे लगता है कि आप दो विकल्प हैं:

  1. आप एक कस्टम UIViewController में दृश्य डाल दिया और सभी झुकाव आप का समर्थन करना चाहते के लिए हाँ लौटने के लिए shouldAutorotateToInterfaceOrientation: विधि ओवरराइड। व्यू कंट्रोलर स्वचालित रूप से सामग्री को घुमाएगा और आकार बदल देगा (आपका दृश्य)। आपको बस यह सुनिश्चित करना होगा कि सही ऑटोरेसाइज़मास्क (या बाधाएं, यदि आप ऑटोलायआउट का उपयोग कर रहे हैं)।
  2. आप एक्सेलेरोमीटर के साथ डिवाइस अभिविन्यास में सीधे परिवर्तनों का निरीक्षण करते हैं। फिर जब आवश्यक हो तो आप अपना दृश्य समायोजित कर सकते हैं।

यह वास्तव में पहला दृष्टिकोण है जिसे आप चुन सकते हैं यदि आप कर सकते हैं।

42

आप डिवाइस मिल सकता है रोटेशन सूचनाएं पैदा करने शुरू करने के लिए:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

अपने स्वयं के चयनकर्ता एक डिवाइस रोटेशन अधिसूचना के लिए एक पर्यवेक्षक के रूप में:

 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil]; 

और फिर अपनी अधिसूचना हैंडलर लिखना

- (void)deviceOrientationDidChange:(NSNotification *)notification { 
    //Obtain current device orientation 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

     //Do my thing 
} 

पर्यवेक्षक को हटाने के लिए याद रखें जब dealloc विधि आप कस्टम UIView को (या जब आप कर चुके हैं) कहा जाता है और डिवाइस परिवर्तन अधिसूचनाओं को भी उत्पन्न करना बंद कर देता है।

-(void) dealloc{ 
[[NSNotificationCenter defaultCenter] removeObserver: self]; 
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
} 

क्या यह आपके प्रश्न के साथ बिल्कुल मदद करता है?

+0

इसका उपयोग न करें क्योंकि यह डिवाइस के एक्सेलेरोमीटर को सक्रिय करेगा। जब तक आप 'endGeneratingDeviceOrientationNotifications' को कॉल नहीं करते हैं तब तक एक्सेलेरोमीटर सक्रिय रहेगा। लेकिन यदि आपका विचार एक सेल व्यू है, तो जब तक आप तालिका दृश्य को अस्वीकार नहीं करते हैं, तब तक यह कभी भी समाप्त नहीं होगा (जो कभी होने की संभावना नहीं है)। आप इसके बजाय 'if UIScreen.main.bounds.height> UIScreen.main.bounds.width' का उपयोग कर सकते हैं। –

3

मैं स्विफ्ट 3 के लिए @ clearwater82 के जवाब पुनर्लेखन कर रहा हूँ के बाद से अपने दृष्टिकोण से एक मैं का उपयोग कर समाप्त हो गया है:

मैं मेरे विचार के init विधि में निम्नलिखित कोड जोड़ा (एक नियंत्रक के लिए इसे में होगा viewDidLoad विधि है):

// Handle rotation 
UIDevice.current.beginGeneratingDeviceOrientationNotifications() 
NotificationCenter.default.addObserver(
    self, 
    selector: #selector(self.orientationChanged(notification:)), 
    name: NSNotification.Name.UIDeviceOrientationDidChange, 
    object: nil 
) 


मैं तो मेरे विचार करने के लिए orientationChanged विधि गयी। आप अपनी इच्छानुसार इस विधि का नाम बदल सकते हैं, बस भी ऊपर कोड स्निपेट में यह नाम बदलने के लिए याद रखें:

// Called when device orientation changes 
@objc func orientationChanged(notification: Notification) { 
    // handle rotation here 
} 


अन्त में मैं अनावश्यक सूचनाएं निकालने के लिए deinit विधि जोड़ा जब दृश्य हटा दिया जाता है:

deinit { 
    NotificationCenter.default.removeObserver(self) 
    UIDevice.current.endGeneratingDeviceOrientationNotifications() 
} 

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

मुझे आशा है कि यह उपयोगी है, चियर्स