由于没有官方 API 可以使用用户的 Memoji,我构建了一个简单的视图来检索它们并根据你的喜好使用它们。
MemojiView 的工作原理是在用于用户输入的实际 View 后面设置一个 TextView。传入的字符串被转换为图像并显示在视图中。这可能也会导致用户输入的字符或表情符号也被转换为图像。你可以选择遵守代理并显示警告,如果用户选择了 Memoji 以外的任何内容,或者简单地接受任何类型的输入。
let memojiView = MemojiView(frame: .zero)
memojiView.tintColor = .purple
self.view.addSubview(memojiView)
MemojiView 有 3 种类型的图像。
memoji
:是一个单独的 Memoji 图像。emoji
:是一个单独的 Emoji 图像。text(Int)
:一个转换为图像的字符串,包括字符计数和实际文本enum MemojiImageType: Equatable {
case memoji
case emoji
case text(Int)
}
要响应图像的变化,请在你的类(例如 View Controller)中实现 MemojiViewDelegate
协议,然后设置视图的 delegate
属性
class MyViewController: UIViewController, MemojiViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let memojiView = MemojiView(frame: .zero)
memojiView.delegate = self
}
// MemojiView delegate
func didUpdateImage(image: UIImage?, type: ImageType) {
// Do something with the image or check the type of the image and respond accordingly.
}
}
或者使用 Closure 来处理图像
memojiView.onChange = { image, imageType in
// Do something on image change
}
你可以继承 MemojiView 来添加或覆盖子视图。例如,替换默认的 UIImageView
class CustomMemojiView: MemojiView {
override func setupUI() {
let customLabel = UILabel()
customLabel.text = "Custom Memoji View"
customLabel.textAlignment = .center
customLabel.translatesAutoresizingMaskIntoConstraints = false
addSubview(customLabel)
NSLayoutConstraint.activate([
customLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
customLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -10)
])
}
}
如前所述,我们无法真正控制键盘,因此无法控制用户的输入。简单地更改键盘类型会导致不同的结果。使用默认字符键盘也会将它们转换为图像。
Apple 没有提供以编程方式强制使用表情符号键盘的官方方法。但是,您可以检测用户何时更改键盘类型并做出相应反应。如果您想在表情符号键盘失去焦点时(如果用户切换回另一种输入模式)采取操作,这将特别有用。以下示例演示了如何监听键盘输入模式更改并仅在输入模式更改时做出反应
NotificationCenter.default.addObserver(
self,
selector: #selector(inputModeDidChange),
name: UITextInputMode.currentInputModeDidChangeNotification,
object: nil
)
@objc func inputModeDidChange(_ notification: Notification) {
// Attempt to retrieve the new input mode
guard let currentInputMode = notification.userInfo?["UITextInputFromInputModeKey"] as? UITextInputMode else {
print("Unable to detect the current input mode.")
return
}
switch currentInputMode.primaryLanguage {
case "emoji":
print("Emoji keyboard was active! Handle accordingly.")
default:
print("Keyboard type changed to: \(currentInputMode.primaryLanguage ?? "unknown")")
}
}
从 iOS 13 开始,MemojiView
通过 MemojiViewRepresentable
提供对 SwiftUI 的支持。 这使您可以将 MemojiView 集成到您的 SwiftUI 项目中。
import SwiftUI
import MemojiView
struct ContentView: View {
@State private var displayedImage: UIImage?
@State private var displayedType: MemojiImageType?
var body: some View {
VStack(spacing: 20) {
Text("Memoji Editor").font(.headline)
MemojiViewRepresentable(
image: $displayedImage,
memojiType: $displayedType,
isEditable: .constant(true),
maxLetters: 10,
textColor: .blue
) { updatedImage, updatedType in
print("Updated image: \(updatedImage?.description ?? "nil")")
print("Updated type: \(updatedType)")
}
.frame(height: 200)
.border(Color.gray, width: 1)
}
.padding()
}
}
对于以 iOS 12 为目标的项目,目前 SwiftUI-Support 不可用。 但是,您可以创建一个类似于 MemojiViewRepresentable 的 UIKit 兼容包装器。 您可以依赖闭包来处理更新,而不是使用绑定。
要使用 Swift Package Manager 将 MemojiView
集成到您的项目中,请将以下内容添加到您的 Package.swift 文件中
dependencies: [
.package(url: "https://github.com/emrearmagan/ModalKit.git", from: "0.0.2")
]
⚠️ 注意
CocoaPods 支持已在 0.0.4 版本中删除。在此之前,将不存在支持。强烈建议使用 SPM。
您可以通过将 MemojiView 添加到您的 Podfile 中来使用 CocoaPods 安装 MemojiView
pod 'MemojiView'
非常感谢您的贡献! 要提交一个