【问题标题】:ios swift How to programmattically change background color of view on screen rotation?ios swift如何以编程方式更改屏幕旋转时视图的背景颜色?
【发布时间】:2020-09-16 11:25:47
【问题描述】:

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

以下代码在调试控制台中打印“landcape”和“portrait”,每次我在模拟器中旋转设备:-

  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:

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

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

通过以下代码实现-

//原始肖像模式/////

    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)



        ])
     }

  }

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

    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 原则吗?

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

【问题讨论】:

  • 您认为切换translatesAutoresizingMaskIntoConstraints 与color 事物是什么有关吗?

标签: swift layout orientation programmatically


【解决方案1】:

你如何设置一个变量并根据值设置颜色?

 import UIKit

  class OrientationViewController: UIViewController {

  var screenOrientation = ""

  override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {

        print("landscape")
        self.screenOrientation = "landscape"

    } else {

        print("portrait")
        self.screenOrientation = "portrait"

    }
  }
if self.screenOrientation == "landscape" {
   self.yourView.backgroundColor = UIColor.//set color
}
else if self.screenOrientation == "portrait" {
   self.yourView.backgroundColor = UIColor.//set different color
}
else{
   self.yourView.backgroundColor = UIColor.//set default color
}

【讨论】:

    【解决方案2】:

    我不得不查看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.backgroundColor 和portraitsmallview.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
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多