微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UINavigationController将整个UIView推到左上方

如何解决UINavigationController将整个UIView推到左上方

我正在使用Storyboards进行100天的Swift 工作,并且遇到了一些问题,几乎完全将UI View推到了UINavigationController下。删除UINavigationController时,一切都会按预期进行。我试图添加一个新视图,设置edgesForExtendedLayout =[],并将我的CGRect的y调整为无效。我几乎可以肯定我正在做一些愚蠢的事情,但是我一生都无法弄清楚是什么。

视图的屏幕截图:

enter image description here

预计这3个按钮将从navView开始显示

SceneDelegate.swift:

func scene(_ scene: UIScene,willConnectTo session: UIScenesession,options connectionoptions: UIScene.Connectionoptions) {
      guard let windowScene = (scene as? UIWindowScene) else { return }
      window = UIWindow(frame: windowScene.coordinateSpace.bounds)
      let viewController = ViewController()
      window?.rootViewController = UINavigationController(rootViewController: viewController)
      window?.makeKeyAndVisible()
      window?.windowScene = windowScene
    }

ViewController.swift:

class ViewController: UIViewController {

    var button1: UIButton!
    var button2: UIButton!
    var button3: UIButton!
        
    var countries = [String]()
    var score = 0
    var correctAnswer = 0
            
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        button1 = UIButton(type: .custom)
        button1.setimage(UIImage(named: "us"),for: .normal)
        button1.translatesAutoresizingMaskIntoConstraints = false
        button1.frame = CGRect(x: 100,y: 100,width: 200,height: 100)
        button1.layer.borderWidth = 1
        button1.layer.borderColor = UIColor.lightGray.cgColor
        view.addSubview(button1)
        
        button2 = UIButton(type: .custom)
        button2.setimage(UIImage(named: "us"),for: .normal)
        button2.translatesAutoresizingMaskIntoConstraints = false
        button2.frame = CGRect(x: 100,y: 230,height: 100)
        button2.layer.borderWidth = 1
        button2.layer.borderColor = UIColor.lightGray.cgColor
        view.addSubview(button2)
        
        button3 = UIButton(type: .custom)
        button3.setimage(UIImage(named: "us"),for: .normal)
        button3.translatesAutoresizingMaskIntoConstraints = false
        button3.frame = CGRect(x: 100,y: 360,height: 100)
        button3.layer.borderWidth = 1
        button3.layer.borderColor = UIColor.lightGray.cgColor
        view.addSubview(button3)
        
        countries += ["estonia","france","germany","ireland","italy","monaco","nigeria","poland","russia","spain","uk","us"]
        
        
        askQuestion()
    }
    
    func askQuestion() {
        countries.shuffle()
        correctAnswer = Int.random(in: 0...2)
        
        button1.setimage(UIImage(named: countries[0]),for: .normal)
        button2.setimage(UIImage(named: countries[1]),for: .normal)
        button3.setimage(UIImage(named: countries[2]),for: .normal)
        
        title = countries[correctAnswer].uppercased()
    }
}

解决方法

根据OP的评论...

问题在于您要设置的每个按钮:

button1.translatesAutoresizingMaskIntoConstraints = false

但随后尝试显式设置按钮框架:

button1.frame = CGRect(x: 100,y: 100,width: 200,height: 100)

您要 使用自动布局或显式框架。混合它们会导致麻烦,UI元素不会显示在您期望的位置(如您所见)。

,

由于您在不使用情节提要的情况下构建视图。您应该添加约束以编程方式放置按钮。

将下面的代码添加到viewDidLoad func

button1.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.init(item: button1!,attribute: .top,relatedBy: .equal,toItem: view.safeAreaLayoutGuide,multiplier: 1,constant: 0).isActive = true

或者,

button1.translatesAutoresizingMaskIntoConstraints = false
button1.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true

他们做同样的事情-以编程方式将约束从button1添加到顶部safeArea。您还可以根据需要向button2和button3添加约束。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。