2012-08-25 37 views
5

Tôi có một UIView đó là lập trình được tạo ra:Làm thế nào để phát hiện luân phiên cho một UIView tạo theo chương trình

- (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; 
} 

Làm thế nào tôi có thể phát hiện luân chuyển? Điều này là để hoạt động như một phương thức trên một chế độ xem hiện tại khác. Đây là một ứng dụng chỉ dành cho iPad, nếu điều đó quan trọng.

+0

Bạn có nghĩa là góc UIView của luân chuyển, hoặc định hướng của thiết bị? –

+0

Xem câu trả lời tuyệt vời này - http://stackoverflow.com/a/3897243/194544 – beryllium

Trả lời

5

Tôi nghĩ rằng bạn có hai lựa chọn:

  1. Bạn đặt quan điểm trong một tùy chỉnh UIViewController và ghi đè lên các phương pháp shouldAutorotateToInterfaceOrientation: trở YES cho tất cả các định hướng bạn muốn hỗ trợ. Bộ điều khiển xem sẽ tự động xoay và thay đổi kích thước nội dung (chế độ xem của bạn). Bạn chỉ cần đảm bảo có autoresizeMask đúng (hoặc các ràng buộc, nếu bạn đang sử dụng autolayout).
  2. Bạn trực tiếp quan sát các thay đổi đối với hướng thiết bị bằng gia tốc kế. Sau đó, bạn có thể điều chỉnh chế độ xem của mình khi cần.

Đây thực sự là phương pháp đầu tiên bạn nên chọn nếu có thể.

42

Bạn có thể nhận các thiết bị để bắt đầu tạo ra các thông báo luân chuyển:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

Thêm chọn của riêng bạn như một người quan sát cho một thông báo luân chuyển thiết bị:

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

Và sau đó viết handler thông báo của bạn

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

     //Do my thing 
} 

Hãy nhớ xóa người quan sát khi phương thức dealloc của bạn tùy chỉnh UIView được gọi là (hoặc khi bạn đang thực hiện) và ngừng tạo ra các thông báo thay đổi thiết bị là tốt.

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

Điều này có giúp ích gì cho câu hỏi của bạn không?

+0

Không sử dụng điều này vì nó sẽ kích hoạt gia tốc kế của thiết bị. Gia tốc kế sẽ vẫn hoạt động cho đến khi bạn gọi 'endGeneratingDeviceOrientationNotifications'. Nhưng nếu chế độ xem của bạn là chế độ xem ô, thì nó sẽ không bao giờ bị deallocated cho đến khi bạn deallocate xem bảng (mà không bao giờ có khả năng xảy ra). Thay vào đó, bạn có thể sử dụng 'if UIScreen.main.bounds.height> UIScreen.main.bounds.width'. –

3

Tôi viết lại câu trả lời @ clearwater82 cho Swift 3 kể từ cách tiếp cận của ông là một trong những tôi đã kết thúc bằng:

tôi đã thêm đoạn mã sau vào phương pháp quan điểm của tôi của init (đối với một bộ điều khiển nó sẽ ở đó là viewDidLoad phương pháp):

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


sau đó tôi thêm một phương thức orientationChanged đến quan điểm của tôi. Bạn có thể đổi tên phương pháp này như bạn muốn, chỉ cần nhớ cũng để đổi tên nó trong đoạn mã trên:

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


Cuối cùng tôi đã thêm các deinit phương pháp để loại bỏ các thông báo không cần thiết khi xem được lấy ra:

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

Nội dung cuối cùng này là xóa chế độ xem khỏi người quan sát thông báo và sau đó dừng thiết bị tạo thông báo xoay khác. Cách tiếp cận này là những gì tôi cần nhưng bạn có thể không muốn ngừng tạo thông báo khi chế độ xem bị xóa.

Tôi hy vọng điều này rất hữu ích, cheers

Các vấn đề liên quan