2014-09-30 25 views
8

Sau khi chuyển sang iOS8, tôi nhận được hành vi lạ khi tôi di chuyển chế độ xem trong khi chuyển đổi bàn phím. Bất cứ ai có thể giải thích những gì đang xảy ra?iOS8: Điều gì đang xảy ra với các chế độ xem chuyển động trong quá trình chuyển đổi bàn phím?

Dưới đây là một ví dụ tối thiểu để chứng minh sự cố. Tôi có một cái nhìn đơn giản với một số UITextFieldUIButton. Hàm nudgeUp di chuyển trường văn bản và nút tăng 10 điểm. Nó được kích hoạt hoặc bằng gọi lại buttonPressed hoặc gọi lại keyboardWillShow.

Khi tôi nhấn vào nút, mã hoạt động như mong đợi: buttonPressed gọi nudgeUp và trường văn bản và nút tăng lên 10 điểm.

Khi tôi nhấn vào trường văn bản, keyboardWillShow gọi nudgeUp, nhưng hành vi này rất khác. Trường nút và văn bản ngay lập tức nhảy xuống xuống 10 điểm và sau đó trượt trở lại vị trí ban đầu khi bàn phím hiển thị chính nó.

Tại sao điều này lại xảy ra? Làm thế nào tôi có thể lấy lại quyền kiểm soát hoạt ảnh trong khi trình bày bàn phím trong iOS8?

#import "ViewController.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 

} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    // Called when the keyboard appears. 
    [self nudgeUp]; 
} 

- (IBAction)buttonPressed:(id)sender { 
    [self nudgeUp]; 
} 

- (void)nudgeUp 
{ 
    CGRect newTextFieldFrame = self.textField.frame; 
    newTextFieldFrame.origin.y -= 10; 
    self.textField.frame = newTextFieldFrame; 

    CGRect newButtonFrame = self.button.frame; 
    newButtonFrame.origin.y -= 10; 
    self.button.frame = newButtonFrame; 
} 
@end 
+0

Tôi thấy câu hỏi này bởi vì tôi nhìn thấy rằng UIKeyboardWillShowNotification không bao giờ thậm chí được đăng. (Như trong, một điểm ngắt trong bộ chọn được tham chiếu trong cuộc gọi addObserver không bao giờ được nhấn!). Bạn có xác minh rằng thông báo thực sự đang được đăng cho bạn không? (Tôi hỏi vì mặc dù biết rằng iOS 8 và bố cục tự động có thể gây trở ngại, nhưng ứng dụng của tôi đủ lớn để không được xây dựng với bố cục tự động tại chỗ). – tobinjim

+0

Cập nhật: Đã tạo một ứng dụng một cửa sổ mới với một trường văn bản trong đó và các bài đăng thông báo bất kể hộp kiểm AutoLayout ... hmm) – tobinjim

+0

Xin lỗi, không thể giúp bạn. Thông báo chắc chắn đang được đăng trong mã của tôi. – Pitarou

Trả lời

8

Tự động hoàn thành. Một cái gì đó thay đổi trong iOS8 và bạn không thể chỉ thay đổi khung hoặc điểm trung tâm nữa nếu bạn đã bật tính năng Tự động điền. Bạn phải tạo ra một ổ cắm (s) của ràng buộc của bạn (không gian dọc) và cập nhật nó cho phù hợp thay vì thay đổi vị trí khung. Hạn chế giống như bất kỳ kiểm soát ui khác và có thể có một lối thoát. Thay đổi hạn chế có thể được làm động.

Ví dụ:

[UIView animateWithDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] delay:0 options:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue] animations:^{   
    self.bottomSpaceConstraint.constant = adjustmentedValue; 
    [self.view layoutIfNeeded];   
} completion:^(BOOL finished) { 
}]; 
+0

Cảm ơn rất nhiều vì câu trả lời sâu sắc của bạn. Tôi đặt tiền thưởng 200 điểm cho câu hỏi này. Tôi ước tôi có thể trao nó cho bạn, nhưng vào thời điểm bạn trả lời tiền thưởng đã hết hạn. – Pitarou

+0

Điều này thực sự phức tạp. Tôi đã dành nhiều ngày về vấn đề này, cảm ơn thông tin. –

0

Bạn nên sử dụng UIKeyboardDidShowNotification (bạn đang sử dụng phiên bản will) và tất cả mọi thứ sẽ làm việc như bạn mong đợi:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShow:) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 

} 

- (void)keyboardDidShow:(NSNotification *)notification 
{ 
    // Called when the keyboard finished showing up 
    [self nudgeUp]; 
} 

Lời giải thích là với UIKeyboardWillShowNotification bạn đang thay đổi các khung quá sớm. Sau khi thay đổi, hệ thống sẽ chuyển tiếp mọi thứ để chứa bàn phím và các thay đổi của bạn sẽ không có hiệu lực.

Ngoài ra, tôi khuyên bạn nên chuyển sang chế độ tự động điền và quên các khung.

+0

Giải pháp của bạn sẽ làm những gì bạn nói, nhưng tôi không muốn hoạt ảnh của mình xảy ra * sau * bàn phím đã xuất hiện xong; Tôi không hiểu làm thế nào các hành vi tôi nhìn thấy có thể được mô tả như là một "relayout để chứa bàn phím"; và tôi không hiểu tại sao mã của tôi hoạt động trong iOS7 nhưng không hoạt động trong iOS8. – Pitarou

0

Hãy thử sử dụng UIKeyboardWillShowNotification userInfo để cung cấp cho bạn khung bàn phím. Sau đó di chuyển các yếu tố trên màn hình dựa trên đó.

+0

Đó là những gì tôi đã làm tất cả cùng, và nó hoạt động tuyệt vời trong iOS7.Nhưng trong iOS8 nó hoạt động theo cùng cách với mã ví dụ (đơn giản hơn nhiều) tôi đã đưa ra ở trên: khung nhảy theo hướng * đối diện * theo cách tôi nói, và sau đó quay lại vị trí ban đầu của nó. – Pitarou

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