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

问题描述 投票:1回答:2

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

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

ios swift xcode
2个回答
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
投票

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

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

...

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

...

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.