0

OK、 UICollectionViewでプログラムで項目を選択するなどの同様の投稿を見て、独自の方法を試しましたが、プログラムで作成したUICollectionViewでSwiftで項目を選択できません。

私は iMessage 拡張機能を構築しており、UICollectionview を作成して、MSStickerBrowser の代わりにカスタム MSStickerViews を保存しました。次のように MSStickerView を作成します。MSStickerView には、剥がされたりタップされたりしたときに検出するカスタム クラスがあります。

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

次に、別の投稿から採用したカスタムクラスで:

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)
        }
    }
}

私の問題は、コレクションビューのその場所でステッカービューの1つをプログラム的に(ボタンのように)選択できるようにする必要があることです。ユーザーがステッカーをタップして iMessage テキスト入力フィールドに表示されるようにシミュレートすることを意味します。

ステッカーを入力欄に直接貼る方法がわからなかったので、シミュレートタッピングアプローチを使用しています。

私のコレクションビューにはヘッダーがあり、次を使用してコレクションビューでアイテムを選択しようとしましたが、0,0 を入力したときに別の行/セクションをナビゲートしようとしても何も起こりません (ヘッダーを選択していると思われます)。それ以外は何もしないか、Uncaught 例外エラーを行います:

collectionView.selectItem(at: IndexPath(row: 0, section: 1), animated: false, scrollPosition: UICollectionViewScrollPosition.left)

クラスから didTap とカスタム関数を直接呼び出しましたが、これは関数を呼び出したばかりのステッカーを選択しませんでした:

stickerViewDidSelect(stickers[1])

MSStickerView/MSSticker でタップ イベントをトリガーして入力フィールドに配置する方法を見つける必要があります。これどうやってするの?

4

1 に答える 1

0

collectionView で使用される indexPath は、Row と Section ではなく、Item と Section です。次を使用して indexPath を初期化します。

IndexPath(item: itemToSelect, section: 0)

itemToSelect は、必要なアイテムを含む Int であり、必要なアイテムを選択できるはずです。

于 2016-12-07T01:26:16.050 に答える