2016-07-18 19 views
15

Tôi đang thử nghiệm với các ứng dụng iMessage hình dán trong iOS 10 và tôi đang gặp sự cố với phương pháp override func didStartSending(_ message: MSMessage, conversation: MSConversation) trong MSMessagesAppViewController. Khi "bóc" một hình dán từ MSStickerView, tôi sẽ nhận được một số kiểu gọi lại theo phương thức didStartSending. Nhưng nó xuất hiện đây không phải là trường hợp. Có ai biết nếu đây là hành vi dự kiến ​​và/hoặc nếu có một cách khác để đăng ký gọi lại cho khi các nhãn dán được bóc vỏ, kéo và rơi vào MSConversation? Tôi nhận thấy rằng didStartSending được dành riêng khi người dùng chạm vào nút gửi nhưng chắc chắn phải có một số cách để biết thời điểm người dùng kéo MSStickers mà không cần hack cùng một số tính năng quét UIView/rect-reading heuristic.Gọi lại cho MSSticker Peels trong iOS 10 Ứng dụng hình dán iMessage

Messages Xem Bộ điều khiển:

class MessagesViewController: MSMessagesAppViewController { 

    var nYCStickersBroswerViewController: NYCStickersBroswerViewController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     nYCStickersBroswerViewController = NYCStickersBroswerViewController(stickerSize: .regular) 
     nYCStickersBroswerViewController.view.frame = self.view.frame 

     self.addChildViewController(nYCStickersBroswerViewController) 
     nYCStickersBroswerViewController.didMove(toParentViewController: self) 
     self.view.addSubview(nYCStickersBroswerViewController.view) 

     nYCStickersBroswerViewController.loadStickers() 
     nYCStickersBroswerViewController.stickerBrowserView.reloadData() 
    } 

    ... 

    override func didStartSending(_ message: MSMessage, conversation: MSConversation) { 
     // Called when the user taps the send button. 
     print(message) // should this not contain the sticker that is peeled, dragged, and dropped into the conversation? 
    } 

} 

Sticker Trình duyệt:

import Foundation 
import UIKit 
import Messages 

class ASSticker: MSSticker { 
    var identifier: String? 
} 

class NYCStickersBroswerViewController: MSStickerBrowserViewController { 

    var stickers = [ASSticker]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func changeBrowswerViewBackgroundColor(color: UIColor) { 
     stickerBrowserView.backgroundColor = color 
    } 

    func loadStickers() { 
     createSticker(name: "brooklyn", localizedDescription: "Brooklyn Bridge Sticker") 
     createSticker(name: "liberty", localizedDescription: "Statue of Liberty Sticker") 
     createSticker(name: "love", localizedDescription: "I Love New York Sticker") 
     createSticker(name: "mets", localizedDescription: "New York Mets Sticker") 
     createSticker(name: "rangers", localizedDescription: "New York Rangers Sticker") 
     createSticker(name: "subway", localizedDescription: "New York City MTA Subway Train Sticker") 
    } 

    func createSticker(name: String, localizedDescription: String) { 
     guard let stickerPath = Bundle.main.pathForResource(name, ofType: "png") else { 
      print("Call ae cab, you're intoxicated.") 
      return 
     } 
     let stickerURL = URL(fileURLWithPath: stickerPath) 
     let sticker: ASSticker 
     do { 
      try sticker = ASSticker(contentsOfFileURL: stickerURL, localizedDescription: localizedDescription) 
      sticker.identifier = "something unique" 
      stickers.append(sticker) 
     } catch { 
      print("Call a cab, you're intoxicated.") 
     } 
    } 

    override func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int { 
     return self.stickers.count 
    } 
    override func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker { 
     return self.stickers[index] 
    } 

} 
+0

Bạn đã bao giờ làm việc này chưa? Tôi đang gặp vấn đề tương tự – skyguy

+0

Các câu trả lời bên dưới là công việc tuyệt vời xung quanh, nhưng tôi chưa đưa ra giải pháp bằng cách sử dụng kho 'MSStickerBrowserViewController'. –

Trả lời

0

Đây là giải pháp cho dán bóc vỏ và các sự kiện khai thác, nó không được bảo đảm rằng một nhãn dán đặc biệt sẽ được chèn nhưng một xấp xỉ các điểm dữ liệu như vậy - bạn sẽ phải sử dụng lớp con của MSStickerView. Giải pháp này không phải là tương lai, nhưng hoạt động trong thời gian IMHO, do đó tôi hoan nghênh các ý tưởng khác.

import UIKit 
import Messages 

class CustomStickerView : MSStickerView{ 
    class GestureRecognizerReceiver : NSObject, UIGestureRecognizerDelegate{ 
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
      return true 
     } 
    } 
    let _recognizerDelegate = GestureRecognizerReceiver() 

    weak var _recognizer: UITapGestureRecognizer? = nil 
    func setupTapRecognizer(){ 
     if _recognizer == nil { 
      let r = UITapGestureRecognizer(target: self, action: #selector(_customTapReceived)) 
      r.cancelsTouchesInView = false 
      r.delegate = _recognizerDelegate 
      addGestureRecognizer(r) 
      _recognizer = r 
    } 
} 

    func _customTapReceived(){ 
     if let s = sticker{ 
      Analytics.shared.reportEvent(name: "Sticker Inserted", description: s.localizedDescription) 
     } 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesBegan(touches, with: event) 
     if let s = sticker{ 
      Analytics.shared.reportEvent(name: "Sticker Peeled", description: s.localizedDescription) 
     } 

    } 
} 

Cách sử dụng:

let sv = CustomStickerView(frame: _stickerViewHolder.bounds, sticker: sticker) 
sv.setupTapRecognizer() 
_stickerViewHolder.addSubview(sv) 
sv.startAnimating() 
12

Dưới đây là một lớp con và đại biểu sẽ buộc vào vòi nước và báo chí cử chỉ dài recognizers rằng MSStickerView đang sử dụng cho các tương tác lựa chọn và vỏ. Nếu việc triển khai MSStickerView, các thay đổi này có thể không còn cung cấp sự kiện nữa, nhưng không được xảy ra sự cố.

import UIKit 
import Messages 

protocol InstrumentedStickerViewDelegate: class { 
    func stickerViewDidSelect(stickerView: MSStickerView) 
    func stickerViewDidPeel(stickerView: MSStickerView) 
} 

class InstrumentedStickerView: MSStickerView { 
    weak var delegate: InstrumentedStickerViewDelegate? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     for gestureRecognizer in gestureRecognizers ?? [] { 
      if let tapGestureRecognizer = gestureRecognizer as? UITapGestureRecognizer { 
       tapGestureRecognizer.addTarget(self, action: #selector(didTap)) 
      } else if let longPressGestureRecognizer = gestureRecognizer as? UILongPressGestureRecognizer { 
       longPressGestureRecognizer.addTarget(self, action: #selector(didLongPress)) 
      } 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func didTap(tapGestureRecognizer: UITapGestureRecognizer) { 
     if tapGestureRecognizer.state == .Recognized { 
      delegate?.stickerViewDidSelect(self) 
     } 
    } 

    func didLongPress(longPressGestureRecognizer: UILongPressGestureRecognizer) { 
     if longPressGestureRecognizer.state == .Began { 
      delegate?.stickerViewDidPeel(self) 
     } 
    } 
} 
+0

Xin chào, bạn sẽ sử dụng điều này như thế nào nếu tôi có hình dán, làm cách nào tôi có thể sử dụng các chức năng gọi lại này trong lớp học của mình? – skyguy

+0

Ví dụ sử dụng sẽ thực sự hữu ích – skyguy

+0

Giải pháp tuyệt vời! @skyguy để sử dụng, chỉ cần thay thế MSStickerView của bạn với InstrumentedStickerView và đảm bảo đặt thuộc tính ủy nhiệm cho lớp của bạn mà triển khai InstrumentedStickerViewDelegate: 'stickerView.delegate = self' – Swindler

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