ios swift Как программно изменить цвет фона просмотра при повороте экрана? - PullRequest
0 голосов
/ 29 мая 2020

Это часть гораздо более серьезной проблемы, с которой я столкнулся. Я упростил это для вас. Я хочу программно изменить цвет фона представления при ориентации устройства?

Следующий код печатает «пейзаж» и «портрет» в консоли отладки каждый раз, когда я поворачиваю устройство в симуляторе: -

  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 Итак, как программно изменить цвет фона представления каждый раз, когда я вращаюсь устройство?

Пожалуйста, помогите мне кто-нибудь из вас?

edit 1:

Вначале я сказал вам, что это часть большего проблема -

У меня есть кнопки внутри представления, которое в режиме портретной съемки я хочу вот так -

enter image description here

, что достигается следующим код -

// оригинальный портретный режим /////

    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)

        ])
    }

 }

и в альбомном режиме я хочу вот так -

enter image description here

, что достигается с помощью следующего кода -

// режим оригинального ландшафта ///// * 1 038 *

  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

         }
      }

    }

  }

который в В портретном режиме отображается -

enter image description here

, а в ландшафтном режиме -

enter image description here

Как достичь того, что я хочу программно (см. После редактирования 1), т.е. две верхние кнопки, чтобы программно переставлять себя каждый раз, когда пользователь поворачивает устройство. Дело не только в кнопках. Это могут быть ярлыки, изображения, просмотр коллекции и т. Д. c. или что угодно. В результате я хочу программно добиться двух макетов в альбомном и портретном режимах.

Примечания: -

i) Я хочу использовать NSLayoutConstraint.activate, потому что это рекомендует Apple.

ii) Если возможно, я не хочу используйте stackview или containerview, потому что может быть намного больше типов меток, кнопок и т. д. c, но если нет другого пути, я буду использовать его.

iii) Является ли мой код DRY принципом Соответствует?

Также, ребята, пожалуйста, я не заслуживаю отрицательных оценок, потому что, насколько я знаю, об этом раньше не спрашивали. Прошу снимать негативные оценки и подбадривать меня.

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

enter image description hereenter image description hereenter image description here я должен был просмотреть один для 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

        }
    }
}
0 голосов
/ 29 мая 2020

Как насчет того, чтобы установить переменную и установить цвет в зависимости от значения?

 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
}

...