swift - 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 原则吗?
另外,伙计们,拜托,我不应该得到负分,因为据我所知,以前没有人问过这个问题。我请求您删除负面标记并鼓励我。
解决方案
我不得不查看一个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
}
}
}
推荐阅读
- sql - Oracle查询以显示具有先前状态的每一行中的状态变化
- flutter - Flutter 模糊图像边缘不受影响(仅限 iOS)
- php - 将 php 循环数据附加到 JSON 对象
- python - pybind 创建的 *.so 文件与常规 linux 动态库之间的区别
- python - 为目录中所有文件的特定列 python 取每一行的正弦值
- javascript - 计算遗漏项目后向 JSON 对象添加新数组
- php - 如何在 Nginx 的重写规则中包含所有 php 文件?
- spring - 为什么 Spring 程序在 freemarker 模板中不显示图像?
- c# - 如何在 OnCurrentPageChanged 方法中设置 TabbedPage 的 CurrentPage 属性?
- powershell - 来自 MDM 上用户的电子邮件 Bitlocker 状态