2015-09-16 25 views
6

Tôi muốn tạo ra file đính kèm xem, mà những nơi dưới đầu vào xem phụ kiện, trên bàn phím, giống như trong Skype App hoặc Viber:Hiện UIView với các nút trên bàn phím, giống như trong Skype, Viber sứ giả (Swift, iOS)

enter image description here

Tôi đã hỏi câu hỏi này here, nhưng giải pháp đề xuất cho câu hỏi này không quá thanh lịch, vì khi tôi kéo chế độ xem cuộn lên trên cùng, tôi muốn phần đính kèm UIView chuyển xuống bằng bàn phím (tôi sử dụng UIScrollViewKeyboardDismissModeInteractive).

Vì vậy, tôi tạo ra một chức năng, mà tìm hiểu xem, nơi bàn phím và tùy chỉnh xem phụ kiện đầu vào của tôi được đặt:

func findKeyboardView() -> UIView? { 
     var result: UIView? = nil 

     let windows = UIApplication.sharedApplication().windows 
     for window in windows { 
      if window.description.hasPrefix("<UITextEffectsWindow") { 
       for subview in window.subviews { 
        if subview.description.hasPrefix("<UIInputSetContainerView") { 
         for sv in subview.subviews { 
          if sv.description.hasPrefix("<UIInputSetHostView") { 
           result = sv as? UIView 
           break 
          } 
         } 
         break 
        } 
       } 
       break 
      } 
     } 
     return result 
    } 

enter image description here

Và sau đó tôi thêm một tùy chỉnh của tôi UIView và tạo một vài ràng buộc:

func createAttachView() { 
     attach = MessageChatAttachmentsView(frame: CGRectZero) 
     let newView = findKeyboardView() 
     newView!.addSubview(attach!) 
     newView!.addConstraint(NSLayoutConstraint(item: accessoryView, attribute: .Bottom, relatedBy: .Equal, toItem: attach!, attribute: .Top, multiplier: 1.0, constant: 0.0)) 
     attach!.addConstraint(NSLayoutConstraint(item: attach!, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 260)) 
     attach!.addConstraint(NSLayoutConstraint(item: attach!, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 320)) 
    } 

Điều này tạo tùy chỉnh UIView dưới chế độ xem phụ kiện đầu vào và bàn phím phía trên và nó di chuyển khi tôi cuộn lên. Nhưng khi tôi muốn nhấn vào nút, tôi nhấn một phím trên bàn phím.

enter image description hereenter image description here

Vì vậy, làm thế nào tôi có thể di chuyển điểm này đến đỉnh điểm hệ thống phân cấp trong UIInputSetHostView?

+1

Tôi nghĩ bạn nên trao đổi trong một 'inputView' mới và tải lại chế độ xem đầu vào. https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html –

Trả lời

3

Okey, nhờ Brian Nickel, tôi thấy có thể không phải là giải pháp trang nhã, nhưng rất đơn giản. Vì vậy, tôi đã ghi đè inputAccessoryView để tạo một thanh công cụ trên bàn phím. Vì vậy, về cơ bản, nếu tôi nhấn vào nút đính kèm trên thanh công cụ này, tôi muốn xem một inputView khác, không phải bàn phím. Vì vậy, trong đầu vào tùy chỉnh lớp view phụ kiện của tôi được tạo ra chỉ một số TextView, đó là ẩn:

class MessageChatInputAccessoryView : UIToolbar { 
    var textView:UITextView! //textView for entering text 
    var sendButton: UIButton! //send message 
    var attachButton: UIButton! // attach button "+" 
    var attachTextView:UITextView! --> this one 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     ..... 
     ..... 
     attachTextView = UITextView(frame: CGRectZero) 
     attachTextView.alpha = 0.0 
     self.addSubview(attachTextView) 
     .... 
    } 

Vì vậy, trong điều khiển giao diện chính của tôi, tôi tạo ra chức năng, việc tái khởi inputView cho điều này mới được tạo ra attachTextView, một cái gì đó như này:

func attach(sender: UIButton) { 
    if attachMenuIsShown { 
      accessoryView.attachTextView.inputView = accessoryView.textView.inputView 
      accessoryView.attachTextView.reloadInputViews() 
      attachMenuIsShown = false 
     } else { 
      accessoryView.attachTextView.becomeFirstResponder() 
      accessoryView.attachTextView.inputView = MessageChatAttachmentsView(frame: CGRectZero) 
      accessoryView.attachTextView.reloadInputViews() 
      attachMenuIsShown = true 
    } 

} 

Vì vậy, khi tôi nhấn vào nút đính kèm, attachTextView của tôi sẽ trả lời trước và tôi khởi tạo lại chế độ xem đầu vào cho textView này. Và tôi đã xem tập tin đính kèm của tôi xem ngay dưới chế độ xem phụ kiện đầu vào. Và khi tôi nhấn nút đính kèm một lần nữa, tôi tái khởi tạo inputView với inputView mặc định cho textView chính của tôi, đó là xem bàn phím.

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