我正在构建一个模因生成器,并且我正在尝试在操作完成时隐藏工具栏。我不确定为什么工具栏总是可见的。
func generateMemedImage() -> UIImage {
navigationController?.setToolbarHidden(false, animated: false)
// Render view to an image
UIGraphicsBeginImageContext(self.view.frame.size)
view.drawHierarchy(in: self.view.frame, afterScreenUpdates: true)
let memedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
navigationController?.setToolbarHidden(true, animated: false)
return memedImage
}
该函数由以下函数调用:
func save() {
let memedImage = generateMemedImage()
let meme = Meme(topText: topTextField.text!, bottomText: bottomTextField.text!, originalImage: imagePickerView.image!, memedImage: memedImage)
// Add it to the memes array in the Application Delegate
let object = UIApplication.shared.delegate
let appDelegate = object as! AppDelegate
appDelegate.memes.append(meme)
print(appDelegate.memes.count)
}
然后由以下IBAction调用:
@IBAction func shareMeme(_ sender: Any) {
let memedImage = generateMemedImage()
let activityVC = UIActivityViewController(activityItems: [memedImage], applicationActivities: nil)
activityVC.completionWithItemsHandler = {
activity, completed, items, error in
if completed {
self.save()
self.dismiss(animated: true, completion: nil)
}
}
present(activityVC, animated: true, completion: nil)
}
我试过在后面翻转Bool状态,没有运气。我哪里错了? Here也是回购的链接。
您假设与嵌套在NavigationController
(navigationController?.setToolbarHidden
)中的默认工具栏进行交互,但事实是您在UIToolBar
中定义了自定义Storyboard/ViewController
:
因此,为了能够切换自定义UIToolBar
的可见性,首先应该连接插座:
@IBOutlet weak var toolbar: UIToolbar!
然后每当你想隐藏它:
UIView.animate(withDuration: 0.25, animations: { self.toolbar.alpha = 0 })
或显示:
UIView.animate(withDuration: 0.25, animations: { self.toolbar.alpha = 1 })
似乎activityVC.completionWithItemsHandler
是从主线程以外的线程异步调用的。应始终从主线程调用任何UI更新,否则通常会导致奇怪的行为。
在你的情况下,你可以尝试从主线程调用save()
,因为这是调用generateMemedImage()
的方法。它应该看起来像这样:
...
if completed {
DispatchQueue.main.async {
self.save()
self.dismiss(animated: true, completion: nil)
}
}
...
请注意,如果保存时间过长,您的UI可能会变得笨重,因为主要线程在保存时将被阻止。如果是这种情况,您可能需要尝试不同的逻辑进行保存。
您需要注意的另一件事是如何显示/隐藏工具栏。您使用相同的方法两次调用navigationController?.setToolbarHidden()
,以显示然后隐藏它。但是,您需要考虑的是UI更新不会立即执行,而是在主线程中排队,以便在方法返回后执行。因此,将它们保留为现在不会显示/隐藏工具栏。
这不是一个真正的答案,但这些是您在实施中需要考虑的事项。