UIView组件已加载但未显示

时间:2017-05-25 09:01:04

标签: ios swift uiview segue

我有一个不显示其所有组件的ViewController。 我使用performSegue来实现这个VC。 这些组件是UILabel和一到两个UIButton,它取决于时间。

当我使用Debug View Hierarchy时,我看到组件已加载,因此,例如,如果我旋转屏幕,有些显示,UIButton未显示,如果我触摸则正确响应“Touch”在它应该是元素的地方(并以相同的方式显示)

如果我将这个VC放在“Root View Controller”中,我也没有问题,只能从Segue中获取。

您对问题的原因有什么想法吗?

编辑我

我忘了说在后台移动应用程序并返回它也可以使组件显示出来。

viewDidLoad& viewDidAppear函数

class CameraView: UIViewController {
    @IBOutlet weak var titleUI: UILabel!
    @IBOutlet weak var cancelUI: UIButton!
    @IBOutlet weak var flipUI: UIButton!
    @IBOutlet weak var captureUI: UIButton!
    @IBOutlet weak var previewUI: UIView!
    @IBOutlet weak var flashUI: UIButton!
    @IBOutlet weak var touchUI: UIView!
    @IBOutlet weak var retryUI: UIButton!
    @IBOutlet weak var validateUI: UIButton!
    @IBOutlet weak var resultUI: UIImageView!

    var callBack: (Int, UIImage?) -> Void = {
        (status: Int, image: UIImage?) -> Void in
    }
    private var cameraHandler = CameraManager()
    private var flash: CameraFlashMode = .off

    override func viewDidLoad() {
        cancelUI.setIcon(icon: .googleMaterialDesign(.reply), iconSize: 45, color: .white, forState: .normal)
        flipUI.setIcon(icon: .googleMaterialDesign(.switchCamera), iconSize: 45, color: .white, forState: .normal)
        captureUI.setIcon(icon: .googleMaterialDesign(.cameraAlt), iconSize: 45, color: .white, forState: .normal)
        flashUI.setIcon(icon: .googleMaterialDesign(.flashOff), iconSize: 45, color: .white, forState: .normal)
        retryUI.setIcon(prefixText: "", prefixTextColor: .white, icon: .googleMaterialDesign(.chevronLeft), iconColor: .white, postfixText: "Retry", postfixTextColor: .white, forState: .normal, textSize: 15, iconSize: 20)
        validateUI.setIcon(prefixText: "", prefixTextColor: .white, icon: .googleMaterialDesign(.done), iconColor: .white, postfixText: "Save", postfixTextColor: .white, forState: .normal, textSize: 15, iconSize: 20)

        resultUI.clipsToBounds = true
        resultUI.contentMode = .scaleAspectFit

        cancelUI.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.cancel)))
        captureUI.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.capture)))
        flashUI.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.switchFlashMode)))
        flipUI.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.turnCamera)))
        validateUI.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.validate)))
        retryUI.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.retry)))

        cameraHandler.cameraDevice = .back
        cameraHandler.showAccessPermissionPopupAutomatically = false
        cameraHandler.flashMode = flash
        cameraHandler.animateCameraDeviceChange = true
        cameraHandler.cameraOutputMode = .stillImage
        cameraHandler.cameraOutputQuality = .high
        cameraHandler.writeFilesToPhoneLibrary = false
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        cameraHandler.askUserForCameraPermission{result in
            if !result {
                self.callBack(PERMISSION_REFUSED, nil)
                self.close(reason: PERMISSION_REFUSED)
            }
        }
        self.view.setNeedsDisplay()
        retry()
    }
...
}

编辑II

我准备添加截图以显示差异,我意识到在屏幕截图中显示了所有项目,尽管设备上的情况显然并非如此

1 个答案:

答案 0 :(得分:0)

问题在于您使用的库。

向屏幕添加按钮和标签的方式几乎相同,您设置添加内容(文本,图像)的框架,将子视图添加到其父级(无论是在IB中还是通过代码),如果您之后不要改变任何东西,你肯定在屏幕上有一个按钮或标签。

正如你所提到的那样,标签设置正确,这意味着这并不是导致按钮无法显示的一些奇怪的错误,它只是你设置它的方式,即使用{{1功能。我相信你使用这个库有一些错误,因为我不知道图书馆,我不能告诉你究竟是什么,但问题出在这里。

有一种替代方法可以实现您想要的无错误,转到https://material.io/icons/下载您想要的图像,并使用setIcon方法设置按钮的图像{ {1}},你应该把它弄好。