使用 UIActivityViewController 共享您的设备屏幕
Share your device screen with UIActivityViewController
如问题所示,我正在寻找一种在使用 UIActivityViewController 时共享当前设备屏幕的方法。到目前为止,这是我的代码。
@IBAction func buttonShareTapped(sender: UIButton) {
let textToShare = "Here's my text to be shared!"
// Generate the screenshot
UIGraphicsBeginImageContext(view.frame.size)
view.layer.renderInContext(UIGraphicsGetCurrentContext())
var image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
var imageToShare = UIImage(named: "\(image)")
if let myWebsite = NSURL(string: "http://mywebsite.com/")
{
let objectsToShare = [textToShare, imageToShare, myWebsite]
let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
// Excluded Activities Code
activityViewController.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList]
self.presentViewController(activityViewController, animated: true, completion: nil)
}
}
上面的代码从 Let objectsToShare 开头的行产生以下错误:
'_' is not convertible to 'UIImage?'
我认为这是因为 imageToShare 目前返回 nil。
提前致谢。
edit:在上面的示例中,图像变量 returns 下面的值但是 imageToShare 返回 nil 所以我猜问题出在那一行。
<UIImage: 0x7ffc85c12f80>, {320, 504}
也许我的第一条评论已经对您有所帮助,但我会为此添加更多内容。
如果您确定图像始终是有效对象并且可以每次展开它,您可以勇敢地使用它:
var image: UIImage = UIImage(named: "\(image)")!
如果 image
是 nil
并且你想解包它,这个解决方案会导致直接崩溃,所以你可以 只有 当你100% 确定图像在运行时始终有效;
否则才是正确的方法:
if let image: UIImage = UIImage(named: "\(image)") {
// you have the image unwrapped properly, it can be used for anything.
// ...
}
并且如果 image
无法展开 (=nil
),您可以有条件地不添加到您的 objectToShare
数组。
注意:这是一个很好的例子,为什么每次都应该显式定义变量的实际类型(var imageToShare: UIImage? = UIImage(named: "\(image)"
),因为你会假设它的值是展开的,但是它只是一个可选的。
所以这很奇怪,但我不需要将图像转换为命名的 UIImage。当我执行以下操作时,我的代码按预期工作:
if let imageToShare = image {...
然而下面的returns没有
if let image: UIImage = UIImage(named: "\(image)") {...
所以我想从 UIGraphicsGetImageFromCurrentImageContext() 返回的内容不需要进一步转换。
如问题所示,我正在寻找一种在使用 UIActivityViewController 时共享当前设备屏幕的方法。到目前为止,这是我的代码。
@IBAction func buttonShareTapped(sender: UIButton) {
let textToShare = "Here's my text to be shared!"
// Generate the screenshot
UIGraphicsBeginImageContext(view.frame.size)
view.layer.renderInContext(UIGraphicsGetCurrentContext())
var image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
var imageToShare = UIImage(named: "\(image)")
if let myWebsite = NSURL(string: "http://mywebsite.com/")
{
let objectsToShare = [textToShare, imageToShare, myWebsite]
let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
// Excluded Activities Code
activityViewController.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList]
self.presentViewController(activityViewController, animated: true, completion: nil)
}
}
上面的代码从 Let objectsToShare 开头的行产生以下错误:
'_' is not convertible to 'UIImage?'
我认为这是因为 imageToShare 目前返回 nil。
提前致谢。
edit:在上面的示例中,图像变量 returns 下面的值但是 imageToShare 返回 nil 所以我猜问题出在那一行。
<UIImage: 0x7ffc85c12f80>, {320, 504}
也许我的第一条评论已经对您有所帮助,但我会为此添加更多内容。
如果您确定图像始终是有效对象并且可以每次展开它,您可以勇敢地使用它:
var image: UIImage = UIImage(named: "\(image)")!
如果 image
是 nil
并且你想解包它,这个解决方案会导致直接崩溃,所以你可以 只有 当你100% 确定图像在运行时始终有效;
否则才是正确的方法:
if let image: UIImage = UIImage(named: "\(image)") {
// you have the image unwrapped properly, it can be used for anything.
// ...
}
并且如果 image
无法展开 (=nil
),您可以有条件地不添加到您的 objectToShare
数组。
注意:这是一个很好的例子,为什么每次都应该显式定义变量的实际类型(var imageToShare: UIImage? = UIImage(named: "\(image)"
),因为你会假设它的值是展开的,但是它只是一个可选的。
所以这很奇怪,但我不需要将图像转换为命名的 UIImage。当我执行以下操作时,我的代码按预期工作:
if let imageToShare = image {...
然而下面的returns没有
if let image: UIImage = UIImage(named: "\(image)") {...
所以我想从 UIGraphicsGetImageFromCurrentImageContext() 返回的内容不需要进一步转换。