调用函数时无法隐藏iOS工具栏

时间:2018-01-03 11:17:38

标签: ios swift xcode

我正在构建一个模因生成器,并且在操作完成时我试图隐藏工具栏。我不确定为什么工具栏始终可见。

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也是回购的链接。

2 个答案:

答案 0 :(得分:1)

您假设与嵌套在NavigationControllernavigationController?.setToolbarHidden)中的默认工具栏进行交互,但事实是您在UIToolBar内定义了自定义Storyboard/ViewController

enter image description here

为了能够首先切换自定义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 })

答案 1 :(得分:1)

似乎activityVC.completionWithItemsHandler是从主线程以外的线程异步调用的。应始终从主线程调用任何UI更新,否则通常会导致奇怪的行为。

在您的情况下,您可以尝试从主线程调用save(),因为这是调用generateMemedImage()的方法。看起来应该是这样的:

...

if completed {
  DispatchQueue.main.async {
    self.save()
    self.dismiss(animated: true, completion: nil)
  }
}

...

请注意,如果保存时间过长,您的UI可能会变得笨拙,因为主要线程会在保存时被阻止。如果是这种情况,您可能需要尝试不同的逻辑进行保存。

您需要注意的另一件事是如何显示/隐藏工具栏。您使用相同的方法两次调用navigationController?.setToolbarHidden(),以显示然后隐藏它。但是,您需要考虑的是UI更新不会立即执行,而是在主线程中排队,以便在方法返回后执行。因此,将它们保留为现在不会显示/隐藏工具栏。

这不是一个真正的答案,但这些是您在实施中需要考虑的事项。