Swift NSAttributedStringKey 没有正确应用前景色
Swift NSAttributedStringKey not applying foreground color correctly
我正在尝试创建一个 meme 生成器应用程序,以更好地理解 Swift、Xdode、delegates 和 UIKit。我正在尝试使用 NSAttributedStringKey 将模因文本的颜色设置为带有黑色笔划的白色。黑色描边有效,但当用户从相机胶卷中选择图像时,未应用前景色。我已经通过 Whosebug 进行了搜索,但所有解决方案都适用于 Swift 3,而不适用于 Swift 4。我哪里错了?
我在下面包含了我的源代码。
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imagePickerView: UIImageView!
@IBOutlet weak var cameraButton: UIBarButtonItem!
@IBOutlet weak var topText: UITextField!
@IBOutlet weak var bottomText: UITextField!
let memeTextAttributes:[String:Any] = [
NSAttributedStringKey.strokeColor.rawValue: UIColor.black,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white,
NSAttributedStringKey.font.rawValue: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedStringKey.strokeWidth.rawValue: 3.0]
override func viewDidLoad() {
super.viewDidLoad()
// Diable camer a button if camera ource isn't available
cameraButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.camera)
topText.defaultTextAttributes = memeTextAttributes
bottomText.defaultTextAttributes = memeTextAttributes
}
// MARK: Delegate Methods
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imagePickerView.image = image
self.dismiss(animated: true, completion: nil)
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.dismiss(animated: true, completion: nil)
}
@IBAction func pickAnImageFromAlbum(_ sender: Any) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = .photoLibrary
present(pickerController, animated: true, completion: nil)
}
@IBAction func pickAnImageFromCamera(_ sender: Any) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .camera
present(imagePicker, animated: true, completion: nil)
}
}
如果您还要设置 foregroundColor
,请使用否定 strokeWidth
。否则,只能看到笔画。
let attributes = [
NSAttributedStringKey.strokeColor.rawValue: UIColor.black,
NSAttributedStringKey.backgroundColor.rawValue: UIColor.red,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white,
NSAttributedStringKey.font.rawValue: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedStringKey.strokeWidth.rawValue: -4.5]
Swift 5
let attributes = [
NSAttributedString.Key.strokeColor: UIColor.black,
NSAttributedString.Key.backgroundColor: UIColor.red,
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedString.Key.strokeWidth: -3.0]
编辑:请参阅 rmaddy 关于为什么我们需要下面这种情况下的 rawValue
的评论。
笔画宽度负责,负笔画值可以解决你的问题。
Swift 4.2
let attributes = [
NSAttributedString.Key.strokeColor.rawValue: UIColor.black,
NSAttributedString.Key.backgroundColor.rawValue: UIColor.red,
NSAttributedString.Key.foregroundColor.rawValue: UIColor.white,
NSAttributedString.Key.font.rawValue: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedString.Key.strokeWidth.rawValue: -3.0]
Swift 5
let attributes = [
NSAttributedString.Key.strokeColor: UIColor.black,
NSAttributedString.Key.backgroundColor: UIColor.red,
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedString.Key.strokeWidth: -3.0]
我正在尝试创建一个 meme 生成器应用程序,以更好地理解 Swift、Xdode、delegates 和 UIKit。我正在尝试使用 NSAttributedStringKey 将模因文本的颜色设置为带有黑色笔划的白色。黑色描边有效,但当用户从相机胶卷中选择图像时,未应用前景色。我已经通过 Whosebug 进行了搜索,但所有解决方案都适用于 Swift 3,而不适用于 Swift 4。我哪里错了?
我在下面包含了我的源代码。
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imagePickerView: UIImageView!
@IBOutlet weak var cameraButton: UIBarButtonItem!
@IBOutlet weak var topText: UITextField!
@IBOutlet weak var bottomText: UITextField!
let memeTextAttributes:[String:Any] = [
NSAttributedStringKey.strokeColor.rawValue: UIColor.black,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white,
NSAttributedStringKey.font.rawValue: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedStringKey.strokeWidth.rawValue: 3.0]
override func viewDidLoad() {
super.viewDidLoad()
// Diable camer a button if camera ource isn't available
cameraButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.camera)
topText.defaultTextAttributes = memeTextAttributes
bottomText.defaultTextAttributes = memeTextAttributes
}
// MARK: Delegate Methods
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imagePickerView.image = image
self.dismiss(animated: true, completion: nil)
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.dismiss(animated: true, completion: nil)
}
@IBAction func pickAnImageFromAlbum(_ sender: Any) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = .photoLibrary
present(pickerController, animated: true, completion: nil)
}
@IBAction func pickAnImageFromCamera(_ sender: Any) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .camera
present(imagePicker, animated: true, completion: nil)
}
}
如果您还要设置 foregroundColor
,请使用否定 strokeWidth
。否则,只能看到笔画。
let attributes = [
NSAttributedStringKey.strokeColor.rawValue: UIColor.black,
NSAttributedStringKey.backgroundColor.rawValue: UIColor.red,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white,
NSAttributedStringKey.font.rawValue: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedStringKey.strokeWidth.rawValue: -4.5]
Swift 5
let attributes = [
NSAttributedString.Key.strokeColor: UIColor.black,
NSAttributedString.Key.backgroundColor: UIColor.red,
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedString.Key.strokeWidth: -3.0]
编辑:请参阅 rmaddy 关于为什么我们需要下面这种情况下的 rawValue
的评论。
笔画宽度负责,负笔画值可以解决你的问题。
Swift 4.2
let attributes = [
NSAttributedString.Key.strokeColor.rawValue: UIColor.black,
NSAttributedString.Key.backgroundColor.rawValue: UIColor.red,
NSAttributedString.Key.foregroundColor.rawValue: UIColor.white,
NSAttributedString.Key.font.rawValue: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedString.Key.strokeWidth.rawValue: -3.0]
Swift 5
let attributes = [
NSAttributedString.Key.strokeColor: UIColor.black,
NSAttributedString.Key.backgroundColor: UIColor.red,
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: UIFont(name: "HelveticaNeue-CondensedBlack", size: 40)!,
NSAttributedString.Key.strokeWidth: -3.0]