Как добавить стикер VIEWS в браузер в Swift?
Хорошо, как и все я новичок в наклейках MS в Swift, но я пытаюсь выяснить цель / разницу между mssticker и msstickerview. Я прочитал API здесь https://developer.apple.com/reference/messages/msstickerview/1648434-sticker но не могу найти ответ на эту относительно простую проблему - кажется, вы можете добавить только MSStickers (не StickerViews) в MSStickerBrowserView, который является единственным способом их отображения. Однако мне нужно добавить StickerVIEWS, потому что у меня есть собственный класс представления стикера, который я пытаюсь реализовать.
Мои стикеры добавлены в мой браузер здесь:
func loadStickers() {
var url: URL?
var i = 1
while true {
url = Bundle.main.url(forResource: "test\(i)", withExtension: "png") //change test for packs
print("URL IS THIS: \(url)")
guard let url = url else { break }
//make it a sticker
let sticker = try! MSSticker(contentsOfFileURL: url, localizedDescription: "")
let stickerView = InstrumentedStickerView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
stickerView.sticker = sticker
stickerView.delegate = self
stickerViews.append(stickerView)
stickers.append(sticker)
i += 1
}
}
func createStickerBrowser() {
let controller = MSStickerBrowserViewController(stickerSize: .regular)
addChildViewController(controller)
view.addSubview(controller.view)
controller.stickerBrowserView.backgroundColor = UIColor.white
controller.stickerBrowserView.dataSource = self
//resize this programmatically later
view.topAnchor.constraint(equalTo: controller.view.topAnchor).isActive = true
view.bottomAnchor.constraint(equalTo: controller.view.bottomAnchor).isActive = true
view.leftAnchor.constraint(equalTo: controller.view.leftAnchor).isActive = true
view.rightAnchor.constraint(equalTo: controller.view.rightAnchor).isActive = true
}
Как вы можете видеть, я создаю стикер и вид стикера для каждого стикера - мои стикеры хранятся в stickers
Массив и наклейки в stickerViews
массив.
Вот как заполняется браузер:
func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int {
return stickers.count
}
func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker {
return stickers[index] //this isnt displaying stickerveiws only stickers
}
Я попытался изменить тип возвращаемого значения в этих методах на StickerView и вернуть вместо него массив StickerView
func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSStickerView {
return stickerViews[index] //this isnt displaying stickerveiws only stickers
}
однако это вызывает у меня следующую ошибку:
messagesviewcontroller не соответствует протоколу msstickerbrowserviewdatasource
Потому что требуемая функция не реализуется так, как это было раньше. Как отображать стикеры? Что я делаю неправильно?
1 ответ
Вы не можете добавить MSStickerViews
в MSStickerBrowserView
, Чтобы использовать ваш подкласс, вам нужно будет создать свой собственный интерфейс в соответствии с документацией Apple для MSStickerBrowserView:
Если вам нужны дополнительные настройки, вы должны создать свой собственный пользовательский интерфейс, используя объекты MSStickerView.
Если вы хотите эмулировать внешний вид браузера, вы можете просто использовать UICollectionView
и заполнить ячейки с вашими наклейками просмотров