首页 > 解决方案 > ios swift如何以编程方式更改屏幕旋转时视图的背景颜色?

问题描述

这是我遇到的一个更大问题的一部分。我已经为你简化了。我想以编程方式更改设备方向视图的背景颜色?

以下代码在调试控制台中打印“风景”和“肖像”,我在模拟器中旋转设备:-

  import UIKit
  class OrientationViewController: UIViewController {
  override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        print("landscape")
    } else {
        print("portrait")
    }
  }
}

虽然下面的代码什么都不做:-

   import UIKit
   class AskitViewController: UIViewController {
    override func viewDidLoad() {
    let landscapesmallview = UIView()
    landscapesmallview.backgroundColor = .orange
   let portraitsmallview = UIView()
    portraitsmallview.backgroundColor = .purple
    view.addSubview(landscapesmallview)
    view.addSubview(portraitsmallview)

 func viewWillTransition(to size: CGSize, with coordinator:      UIViewControllerTransitionCoordinator) {
     if UIDevice.current.orientation.isLandscape {
        print("landscape")
    landscapesmallview.translatesAutoresizingMaskIntoConstraints = false
     portraitsmallview.translatesAutoresizingMaskIntoConstraints = true
    } else {
        print("potrait")
  portraitsmallview.translatesAutoresizingMaskIntoConstraints = false
  landscapesmallview.translatesAutoresizingMaskIntoConstraints = true
        }
       }
      }
     }

我正在使用 swift 4.2 和或 5,xcode 10.2 那么,如何在每次旋转设备时以编程方式更改视图的背景颜色?

请各位高手帮帮我?

编辑1:

我一开始就告诉过你,这是一个更大问题的一部分——

我在一个视图中有按钮,在我想要这样的肖像模式下 -

在此处输入图像描述

这是通过以下代码实现的 -

//原始人像模式/////

    import UIKit
    class PotraitViewController: UIViewController {
    override func viewDidLoad() {
    let buttonred = UIButton()
    buttonred.backgroundColor = UIColor.red
    let buttonblue = UIButton()
    buttonblue.backgroundColor = UIColor.blue
    let landscapesmallview = UIView()
    view.addSubview(landscapesmallview)
    landscapesmallview.addSubview(buttonred)
    landscapesmallview.addSubview(buttonblue)
    buttonred.translatesAutoresizingMaskIntoConstraints = false
    buttonblue.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([

        buttonred.topAnchor.constraint(equalTo: view.topAnchor,constant: 200),
        buttonred.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        buttonred.trailingAnchor.constraint(equalTo: view.trailingAnchor,constant:-20),
        buttonred.widthAnchor.constraint(equalToConstant: 50),
        //-------
        buttonblue.topAnchor.constraint(equalTo: buttonred.bottomAnchor,constant: 40),
        buttonblue.leadingAnchor.constraint(equalTo: buttonred.leadingAnchor),
        buttonblue.trailingAnchor.constraint(equalTo:buttonred.trailingAnchor),
        buttonblue.widthAnchor.constraint(equalTo: buttonred.widthAnchor)

        ])
    }

 }

在横向模式下我想要这样 -

在此处输入图像描述

这是通过以下代码实现的 -

// 原始横向模式/////

  import UIKit
  class LandscapeViewController: UIViewController {
   override func viewDidLoad() {
    let buttonred = UIButton()
    buttonred.backgroundColor = UIColor.red
    let buttonblue = UIButton()
    buttonblue.backgroundColor = UIColor.blue
    view.addSubview(buttonred)
    view.addSubview(buttonblue)
    buttonred.translatesAutoresizingMaskIntoConstraints = false
    buttonblue.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([

        buttonred.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        buttonred.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant:40),
        buttonred.trailingAnchor.constraint(equalTo: view.centerXAnchor,constant:-20),
        buttonred.widthAnchor.constraint(equalToConstant: 50),

        //-------
        buttonblue.centerYAnchor.constraint(equalTo: buttonred.centerYAnchor),
        buttonblue.leadingAnchor.constraint(equalTo: view.centerXAnchor,constant:40),
        buttonblue.trailingAnchor.constraint(equalTo: view.trailingAnchor,constant:-20),
        buttonblue.widthAnchor.constraint(equalTo:buttonred.widthAnchor)



        ])
     }

  }

因此,我尝试使用以下代码通过屏幕旋转来实现,即借助以下代码以编程方式在 potrait 和 Landscape 视图中实现两种不同的布局:-

    import UIKit

    class NewViewController: UIViewController {
    override func viewDidLoad() {
    let buttonredlandscape = UIButton()
    buttonredlandscape.backgroundColor = UIColor.red
    let buttonbluelandscape = UIButton()
    buttonbluelandscape.backgroundColor = UIColor.blue
    let buttonredportrait = UIButton()
    buttonredportrait.backgroundColor = UIColor.red
    let buttonblueportrait = UIButton()
    buttonblueportrait.backgroundColor = UIColor.blue

    let landscapesmallview = UIView()
    let portraitsmallview = UIView()
    landscapesmallview.backgroundColor = UIColor.gray
    portraitsmallview.backgroundColor = UIColor.purple
    landscapesmallview.frame = view.frame
    portraitsmallview.frame = view.frame
    view.addSubview(landscapesmallview)
    view.addSubview(portraitsmallview)


    landscapesmallview.addSubview(buttonredlandscape)
    landscapesmallview.addSubview(buttonbluelandscape)
    portraitsmallview.addSubview(buttonredportrait)
    portraitsmallview.addSubview(buttonblueportrait)
    buttonredlandscape.translatesAutoresizingMaskIntoConstraints = false
    buttonbluelandscape.translatesAutoresizingMaskIntoConstraints = false
    buttonredportrait.translatesAutoresizingMaskIntoConstraints = false
    buttonblueportrait.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([



    buttonredlandscape.centerYAnchor.constraint(equalTo:landscapesmallview.centerYAnchor),
        buttonredlandscape.topAnchor.constraint(equalTo:landscapesmallview.topAnchor,constant:40),
        buttonredlandscape.trailingAnchor.constraint(equalTo: landscapesmallview.centerXAnchor,constant:-20),
        buttonredlandscape.heightAnchor.constraint(equalTo: landscapesmallview.heightAnchor,constant:50),

        buttonbluelandscape.centerYAnchor.constraint(equalTo:buttonredlandscape.centerYAnchor),
        buttonbluelandscape.leadingAnchor.constraint(equalTo: landscapesmallview.centerXAnchor,constant:40),
        buttonbluelandscape.trailingAnchor.constraint(equalTo: landscapesmallview.trailingAnchor,constant:-20),
        buttonbluelandscape.heightAnchor.constraint(equalTo: buttonredlandscape.heightAnchor),


        buttonredportrait.topAnchor.constraint(equalTo: portraitsmallview.topAnchor,constant: 200),
        buttonredportrait.centerXAnchor.constraint(equalTo: portraitsmallview.centerXAnchor),
        buttonredportrait.trailingAnchor.constraint(equalTo: portraitsmallview.trailingAnchor,constant:-20),
        buttonredportrait.widthAnchor.constraint(equalTo: buttonredportrait.widthAnchor),

        buttonblueportrait.topAnchor.constraint(equalTo: buttonredportrait.bottomAnchor,constant: 40),
        buttonblueportrait.leadingAnchor.constraint(equalTo: buttonredportrait.leadingAnchor),
        buttonblueportrait.trailingAnchor.constraint(equalTo:buttonredportrait.trailingAnchor),
        buttonblueportrait.widthAnchor.constraint(equalTo: buttonredportrait.widthAnchor)


        ])

    //-------



    func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape {
            landscapesmallview.translatesAutoresizingMaskIntoConstraints = false
            portraitsmallview.translatesAutoresizingMaskIntoConstraints = true
        } else if UIDevice.current.orientation.isPortrait {
            portraitsmallview.translatesAutoresizingMaskIntoConstraints = false
            landscapesmallview.translatesAutoresizingMaskIntoConstraints = true

         }
      }

    }

  }

在肖像模式下显示 -

在此处输入图像描述

在横向模式下显示 -

在此处输入图像描述

如何以编程方式实现我想要的(见编辑 1 后),即最上面的 2 个按钮在每次用户旋转设备时以编程方式重新排列自己。它不仅仅是按钮。它可以是标签、图像、collectionview 等或任何东西。结果是我想以编程方式在横向和纵向模式下实现两种布局。

需要注意的点:-

i)我想使用“NSLayoutConstraint.activate”,因为苹果推荐它。

ii) 如果可能,我不想使用stackview 或containerview,因为标签、按钮等的类型可以更多,但如果没有其他方法,那么我会使用它。

iii) 我的代码符合 DRY 原则吗?

另外,伙计们,拜托,我不应该得到负分,因为据我所知,以前没有人问过这个问题。我请求您删除负面标记并鼓励我。

标签: swiftlayoutorientationprogrammatically

解决方案


在此处输入图像描述在此处输入图像描述在此处输入图像描述 我不得不查看一个portraitsmallview和一个用于landscapesmallview 导入 UIKit

class ViewController: UIViewController {
    var landscapesmallview = UIView()
    var portraitsmallview = UIView()

    override func viewDidLoad() {

    landscapesmallview.frame = CGRect.init(x: 0, y: 0, width: 300, height: 500)
    landscapesmallview.backgroundColor = UIColor.yellow     //give color to the view
    landscapesmallview.center = self.view.center
    self.view.addSubview(landscapesmallview)

    portraitsmallview.frame = CGRect.init(x: 0, y: 0, width: 200, height: 300)
    portraitsmallview.backgroundColor = UIColor.blue     //give color to the view
    portraitsmallview.center = self.view.center
    self.view.addSubview(portraitsmallview)

    landscapesmallview.isHidden = true
    portraitsmallview.isHidden = true
        }
    override func viewWillLayoutSubviews() {
        if UIDevice.current.orientation.isPortrait {
            landscapesmallview.isHidden = true
            portraitsmallview.isHidden = false
        } else {
            landscapesmallview.isHidden = false
            portraitsmallview.isHidden = true

        }
    }
}

如果你需要改变背景颜色landscapesmallview.backgroundColorportraitsmallview.backgroundColor

//
//  ViewController.swift
//  test
//
//  Created by Younouss EL OUATI on 5/29/20.
//  Copyright © 2020 Younouss EL OUATI. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    var landscapesmallview = UIView()
    var portraitsmallview = UIView()

    override func viewDidLoad() {

    landscapesmallview.frame = CGRect.init(x: 0, y: 0, width: 300, height: 500)
    landscapesmallview.backgroundColor = UIColor.yellow     //give color to the view
    landscapesmallview.center = self.view.center
    self.view.addSubview(landscapesmallview)

    portraitsmallview.frame = CGRect.init(x: 0, y: 0, width: 200, height: 300)
    portraitsmallview.backgroundColor = UIColor.blue     //give color to the view
    portraitsmallview.center = self.view.center
    self.view.addSubview(portraitsmallview)

    landscapesmallview.isHidden = true
    portraitsmallview.isHidden = true
        }
    override func viewWillLayoutSubviews() {
        if UIDevice.current.orientation.isPortrait {
            landscapesmallview.backgroundColor = UIColor.green
            landscapesmallview.isHidden = true
            portraitsmallview.isHidden = false
        } else {
            portraitsmallview.backgroundColor = UIColor.gray
            landscapesmallview.isHidden = false
            portraitsmallview.isHidden = true

        }
    }
}

推荐阅读