2016-12-07 10 views
0

좋아요, 나는 How to trigger tap gesture recognizer of UIView programmatically 및 비슷한 질문을 보았지만 찾고있는 것을 찾을 수 없습니다. iMessage 앱 확장 프로그램을 구축 중이며 너무 프로그래밍 방식으로 MSSticker에서 탭 이벤트를 트리거해야합니다.트리거를 사용하여 MSSticker를 탭하거나 프로그래밍 방식으로 볼 수 있습니까?

사용자 지정 MSStickerViews는 다음 클래스를 사용하여 눌렀을 때 또는 누른 다음 다른 기능을 트리거하는 것을 감지하지만 실제로이 탭을 시뮬레이트하는 방법을 모르기 때문에 스티커가 입력 필드 :

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(stickerView: self) 
     } 
    } 

    func didLongPress(longPressGestureRecognizer: UILongPressGestureRecognizer) { 
     if longPressGestureRecognizer.state == .began { 
      delegate?.stickerViewDidPeel(stickerView: self) 
     } 
    } 
} 

그냥 탭 어떤 특정 기능을 실행할 필요가 없습니다되어 작동하지 않습니다 위의 탭 기능 중 하나를 호출하는 이유 - 난 그냥에 가짜 탭을 작성해야 MSStickerView 내에서 MSSticker를 사용하면 입력 필드에 입력됩니다. 나는 이것을 어떻게하는지 모른다.

내가 (필자 시도)이 같은 내 MSStickerViews을 생성하고 수집보기에 넣어하지만, 프로그래밍 콜렉션 뷰 셀을 도청하는 것은 아무것도하지 않는다 :

var url: URL? 
     var i = 1 
     while i < 5 { //while true 
      url = Bundle.main.url(forResource: "test5", withExtension: "png") //would be "test\(i)" 
      print("URL IS THIS: \(url)") 
      guard let url = url else { break } 

      //make it a sticker 
      let sticker = try! MSSticker(contentsOfFileURL: url, localizedDescription: "test\(i)") 

      //let stickerView = InstrumentedStickerView(frame: CGRect(x: 0, y: 0, width: view.bounds.width*0.4, height: view.bounds.width*0.4)) 
      let stickerView = InstrumentedStickerView(frame: CGRect(origin: CGPoint(x: 0,y :0), size: stickerSize)) 
      stickerView.sticker = sticker 
      stickerView.delegate = self 

      starterPack.append(stickerView) 

      i += 1 

어쩌면 같은 것을 느낌이 (의사 코드)

starterPack[1].sendActionForEvent(UIEvent.Tap) 

은 올바르지 만 MSStickerView는 .sendActionForEvent

나는 필사적가 없습니다. 가짜 탭을 만들려면 어떻게해야합니까?

+0

나는 또한이 문제에 근무하지만 대신 stickerview의 이미지 뷰를 사용하여이 기능을 달성하고 당신이 당신의 collectionview 세포 위임 방법 didselect에서 원하는 작업을 수행 할 경우 솔루션을하지 않았다 . –

답변

0

현재 MSConversationinsert이 될 수있는 MSMessage을 만들어야합니다.

conversation.insert(message) { error in 
    // handle error 
} 

Apples sample code을 참조하십시오.

+0

자동으로 메시지를 보냅니 까? 나는 반드시 그것을 보내고 싶지 않고, 사람들이 문자 메시지를 초안하는 것과 같이, 텍스트 ENTRY 필드에 넣는다. – skyguy

+0

보내지 않고 삽입한다. 샘플 코드를 확인하십시오. – shallowThought

+0

임 그냥 스티커를 삽입하는 데 몇 가지 문제가 있습니다. 전에 해본 적있어? 내 가장 최근의 질문을 보시겠습니까 http://stackoverflow.com/questions/41070206/problems-with-structs-in-swift-and-making-a-uiimage-from-url – skyguy

-1

명확하게하기 위해 UICollectionViewCell을 표시하는 UICollectionView가 있으며 각 뷰에는 MSStickerView가 있습니다. 나는 이것이 옳다고 가정하면서 앞으로 나아갈 것이다.

사용자가 컬렉션 뷰 셀 중 하나를 탭하면 메시지 상자에 스티커를 삽입하여 사용자가 보내기 단추를 누를 때 스티커가 정확한지 확인합니다.

이 시나리오에서는 UICollectionViewCell 서브 클래스의 MSSticker에 대한 참조를 유지합니다 (하위 클래스가 있다고 가정 할 때, 사용자의 목적에 맞게 작성하는 것이 좋습니다). 그런 다음 사용자가 셀을 두드리고 didSelectCellAt 메서드가 호출되면 해당 셀에서 MSSticker를 가져 와서 메시지에 삽입 할 수 있습니다. 수

희망은 의미

+0

스티커 블록 didSelectCellAt 메서드, @ jeff 시도한 적이 있습니까? –