Ios Swift:在视图上覆盖带有文本的矩形

Ios Swift:在视图上覆盖带有文本的矩形,ios,swift,shape,Ios,Swift,Shape,如果我们的应用程序存在网络连接错误,我们希望在屏幕顶部覆盖一个彩色透明的矩形,并显示一些类似“网络不可用”的文本。矩形应覆盖整个屏幕,高度应足以显示文本。我们将使用计时器仅在短时间内显示矩形。你怎么能做到这一点 实际视图可能是UITableViewController、UIViewController或其他什么…我做叠加的方法是将一个新的UIViewController拖到情节提要中,然后将UIView拖到该情节提要中。在布置UI时,将UIViewController的背景色设置为黑色可能会有所

如果我们的应用程序存在网络连接错误,我们希望在屏幕顶部覆盖一个彩色透明的矩形,并显示一些类似“网络不可用”的文本。矩形应覆盖整个屏幕,高度应足以显示文本。我们将使用计时器仅在短时间内显示矩形。你怎么能做到这一点


实际视图可能是UITableViewController、UIViewController或其他什么…

我做叠加的方法是将一个新的
UIViewController
拖到情节提要中,然后将
UIView
拖到该情节提要中。在布置UI时,将
UIViewController
的背景色设置为黑色可能会有所帮助。在
UIView
中完成元素布局后,将
UIViewController
的背景色更改为透明

以下是纵断面覆盖的示例:

在本例中,我实际上将
UIViewController
背景设置为灰色,alpha值约为50%。然后,当我使用淡入淡出过渡显示此视图控制器时,它看起来似乎出现在当前上下文之上:

func showOverlay() {
    //
    guard let vc = UIStoryboard(name: "MyStoryboard", bundle: nil).instantiateViewController(withIdentifier: "myOverlay") as? UIViewController else {
        print("failed to get myOverlay from MyStoryboard")
        return
    }

    vc.modalPresentationStyle = .overCurrentContext
    vc.modalTransitionStyle = .crossDissolve

    self.present(vc, animated: true, completion: {
        // after 3 seconds, dismiss the overlay
        dispatchAfterSeconds(3) {
            vc.dismiss(animated: true)
        }
    })
}
这使用了一个方便的函数,
dispatchAfterSeconds

// execute function after delay using GCD
func dispatchAfterSeconds(_ seconds: Double, completion: @escaping (() -> Void)) {
    let triggerTime = Int64(Double(NSEC_PER_SEC) * seconds)
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(triggerTime) / Double(NSEC_PER_SEC), execute: { () -> Void in
        completion()
    })
}

请注意,当我谈到更改
UIViewController
的背景色时,实际上,我的意思是在情节提要中创建的
UIViewController
中默认创建的视图的背景色。

我进行叠加的方法是将新的
UIViewController
拖动到情节提要中,然后将
UIView
拖动到该情节提要中。在布置UI时,将
UIViewController
的背景色设置为黑色可能会有所帮助。在
UIView
中完成元素布局后,将
UIViewController
的背景色更改为透明

以下是纵断面覆盖的示例:

在本例中,我实际上将
UIViewController
背景设置为灰色,alpha值约为50%。然后,当我使用淡入淡出过渡显示此视图控制器时,它看起来似乎出现在当前上下文之上:

func showOverlay() {
    //
    guard let vc = UIStoryboard(name: "MyStoryboard", bundle: nil).instantiateViewController(withIdentifier: "myOverlay") as? UIViewController else {
        print("failed to get myOverlay from MyStoryboard")
        return
    }

    vc.modalPresentationStyle = .overCurrentContext
    vc.modalTransitionStyle = .crossDissolve

    self.present(vc, animated: true, completion: {
        // after 3 seconds, dismiss the overlay
        dispatchAfterSeconds(3) {
            vc.dismiss(animated: true)
        }
    })
}
这使用了一个方便的函数,
dispatchAfterSeconds

// execute function after delay using GCD
func dispatchAfterSeconds(_ seconds: Double, completion: @escaping (() -> Void)) {
    let triggerTime = Int64(Double(NSEC_PER_SEC) * seconds)
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(triggerTime) / Double(NSEC_PER_SEC), execute: { () -> Void in
        completion()
    })
}
请注意,当我谈到更改
UIViewController
的背景色时,我实际上指的是在故事板中创建的
UIViewController
内部默认创建的视图的背景色。

您可以这样做:

let deadlineTime = DispatchTime.now() + .seconds(2)

let window = UIApplication.shared.keyWindow!

let rectangleView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 20))
rectangleView.backgroundColor = UIColor.red

let label = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 20))
label.text = "Network not available"

rectangleView.addSubview(label)

window.addSubview(rectangleView)

DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
    rectangleView.removeFromSuperview()
}
您可以这样做:

let deadlineTime = DispatchTime.now() + .seconds(2)

let window = UIApplication.shared.keyWindow!

let rectangleView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 20))
rectangleView.backgroundColor = UIColor.red

let label = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 20))
label.text = "Network not available"

rectangleView.addSubview(label)

window.addSubview(rectangleView)

DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
    rectangleView.removeFromSuperview()
}

谢谢你的回复。但是我想要的解决方案只是在屏幕顶部显示带有文本的条(矩形)。显示文本时,实际屏幕仍然可用。Ie:文本将显示在表格上,当文本在表格上时,您仍然可以滚动表格。Instagram对其网络警报消息使用了类似的方法。这种方法似乎完全显示了新视图而不是现有视图,这使得在显示警报时现有视图不可用。感谢您的响应。但是我想要的解决方案只是在屏幕顶部显示带有文本的条(矩形)。显示文本时,实际屏幕仍然可用。Ie:文本将显示在表格上,当文本在表格上时,您仍然可以滚动表格。Instagram对其网络警报消息使用了类似的方法。这种方法似乎在现有视图的基础上完全显示了新视图,这使得在显示警报时现有视图不可用。谢谢,我将尝试此方法。谢谢,我将尝试此方法。