【问题标题】:How to stop background from blocking other elements in Swift 4?如何阻止背景阻止 Swift 4 中的其他元素?
【发布时间】:2019-05-19 03:57:37
【问题描述】:

我目前正在 Swift 4 / Xcode 10 中制作一个单视图应用程序,其中有一个动画背景和屏幕上的 6 个按钮,每个按钮都链接到一个单独的 ViewController。当我运行应用程序时,动画背景似乎移到了最前面并挡住了所有按钮。如何使按钮显示在背景前面?

问题是,我没有以编程方式创建按钮,而是从界面构建器的对象库中拖放它们。这就是为什么当我尝试发布herehere 的解决方案时,它不起作用,因为我不知道是否有任何实际代码引用任何按钮。例如,当我尝试

view.bringSubview(toFront: theButton)

我不知道用什么来代替按钮,甚至不知道在哪里放置那段 sn-p 代码。

以下是我在“主屏幕”视图控制器上的代码。我最紧迫的问题是在哪里插入代码以将按钮移到前面或将背景移到后面。

import UIKit
import AVFoundation
import AVKit

class ViewController: UIViewController {
    @IBOutlet weak var videoView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupView()
    }
    private func setupView() {
        let path = URL(fileURLWithPath: Bundle.main.path(forResource: "Ocean_Waves_slow_motion_videvo", ofType: "mov")!)
        let player = AVPlayer(url: path)

        let newLayer = AVPlayerLayer(player: player)
        newLayer.frame = self.videoView.frame
        self.videoView.layer.addSublayer(newLayer)
        newLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

        player.play()
        player.actionAtItemEnd = AVPlayer.ActionAtItemEnd.none

        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.videoDidPlayToEnd(_:)), name: NSNotification.Name(rawValue: "AVPlayerItemDidPlayToEndTimeNotification"), object: player.currentItem)
    }
    @objc func videoDidPlayToEnd(_ notification: Notification) {
        let player: AVPlayerItem = notification.object as! AVPlayerItem
        player.seek(to: CMTime.zero)
    }
}

Here 是我的 Main.storyboard 的样子。如果有帮助,层次结构目前是:

查看>视频查看>查看>按钮按钮按钮按钮按钮按钮

【问题讨论】:

    标签: ios swift button background


    【解决方案1】:

    第一个视图->视频视图->按钮BgView->按钮按钮按钮按钮按钮

    不要将buttonsBgView 添加为Video View 的子视图。 Video View 和 buttonsBgView 应该是 1st View 的子视图。

    第一个视图 -> 视频视图

    第一个视图->buttonsBgView->按钮按钮按钮按钮按钮按钮

    为buttonsBgView创建一个IBOutlet,并将该视图置于前面

    class ViewController: UIViewController {
        @IBOutlet weak var videoView: UIView!
        @IBOutlet weak var buttonsBgView: UIView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setupView()
            buttonsBgView.backgroundColor = .clear
            view.bringSubview(toFront: buttonsBgView)
        }
    }
    

    【讨论】:

    • 感谢您的快速回复!我尝试了您的解决方案并得到了an unexpected nil value。我认为这可能是因为我没有正确创建 IBOutlet。第 14 行的圆圈没有填充。我应该去 Main.storyboard 并从对象库中拖动一个视图并将其放在视图控制器上吗?
    • 对不起!是的,我已经修复了 IBOutlet,但它可能与我最初拥有的相同,所以现在它不再崩溃了。动画背景涵盖了一切。我想我理解您的逻辑,将按钮放在视图上,将该视图放在前面并使背景透明,以便只显示按钮。我不知道为什么它不起作用。动画背景代码中是否有一些东西也将它带到了前面?
    • 非常感谢您的帮助 RajeshKumar!我不知道如何将buttonsBgView 带到与videoView 相同的级别。我尝试像在 gif 中那样拖动它,但大多数情况下都没有。我应该删除它并创建一个新视图吗?如果是这样,我该如何创建它使其不是 videoView 的子视图?
    • @J.Wu 删除旧的videoview和buttonsBgView。从对象库中拖放视图。现在复制并粘贴拖放的视图。使用一个作为视频视图,另一个作为buttonBgView
    • 成功了!你有圣人的耐心。非常感谢您的专业知识!
    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2022-01-26
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多