перерисовать пользовательский UIVIEW при изменении ориентации устройства SWIFT 5 - PullRequest
0 голосов
/ 12 июля 2020

Я написал код для нового UIVIEW, но после ротации устройства отрисовка UIVIEW не очищается для новой ситуации! И оставайтесь видимыми для пользователя! посмотрите на картинку. как мы можем решить проблему?

импорт UIKit

class ViewController: UIViewController
{
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
    }
    

    override func viewDidLayoutSubviews()
    {

        var drawView = UIView()

        let drawViewOffsetFromTop = max( 25 , Int( view.safeAreaInsets.top ) )
        let drawViewOffsetFromBottom = max( 25 , Int( view.safeAreaInsets.bottom ) )
        
        let drawViewWidth = Int( view.frame.size.width ) - 2*25
        let drawViewHeight = Int( view.frame.size.height) - drawViewOffsetFromTop - drawViewOffsetFromBottom

        drawView = UIView(frame: CGRect(x: 25 , y: drawViewOffsetFromTop, width: drawViewWidth  , height: drawViewHeight ))
        drawView.backgroundColor = UIColor.gray
        drawView.layer.cornerRadius = 15
        view.addSubview(drawView)
   
    }
    
    
}

введите описание изображения здесь

Ответы [ 3 ]

0 голосов
/ 12 июля 2020

Прежде всего, вы должны не поместить код создания UIView в viewDidLayoutSubviews, а вместо этого создать и добавить его в viewDidLoad. Вы можете поместить код обновления рамки просмотра в viewDidLayoutSubviews.

Проблема в том, что вы добавляете drawView несколько раз, не удаляя существующие. Кроме того, вы инициализируете drawView несколько раз в разных строках без необходимости.

Чтобы устранить проблему, создайте drawView в своем контроллере, добавьте его в супервизор в viewDidLoad и отредактируйте viewDidLayoutSubviews точно так же, как ниже:

class ViewController: UIViewController {
    private var drawView : UIView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(drawView)
    }    
    
    override func viewDidLayoutSubviews() {
        let drawViewOffsetFromTop = max(25 , Int(view.safeAreaInsets.top))
        let drawViewOffsetFromBottom = max(25 , Int(view.safeAreaInsets.bottom))
        
        let drawViewWidth = Int(view.frame.size.width ) - 2*25
        let drawViewHeight = Int(view.frame.size.height) - drawViewOffsetFromTop - drawViewOffsetFromBottom

        drawView.frame = CGRect(x: 25, y: drawViewOffsetFromTop, width: drawViewWidth, height: drawViewHeight)
        drawView.backgroundColor = UIColor.gray
        drawView.layer.cornerRadius = 15
    }
}
0 голосов
/ 12 июля 2020
//▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
var drawView = UIView()
//▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼


//█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
override func viewDidLoad()
{
    super.viewDidLoad()
    view.backgroundColor = UIColor.gray
}
//█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █



//█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
override func viewDidLayoutSubviews()
{

    //▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
    let backView = UIView(frame: CGRect(x: 0 , y: 0, width: view.frame.size.width  , height: view.frame.size.height ))
    backView.backgroundColor = UIColor.gray
    view.addSubview(backView)
    //▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼


    //▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
    let drawViewOffsetFromTop = max( 25 , Int( view.safeAreaInsets.top ) )
    let drawViewOffsetFromBottom = max( 25 , Int( view.safeAreaInsets.bottom ) )
    let drawViewOffsetFromRight = max( 25 , Int( view.safeAreaInsets.right ) )
    let drawViewOffsetFromLeft = max( 25 , Int( view.safeAreaInsets.left ) )
    //▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    

    //▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
    let drawViewWidth = Int( view.frame.size.width ) - drawViewOffsetFromRight - drawViewOffsetFromLeft
    let drawViewHeight =  Int( view.frame.size.height) - drawViewOffsetFromTop - drawViewOffsetFromBottom
    //▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    
    //▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
    drawView = UIView(frame: CGRect(x: drawViewOffsetFromRight , y: drawViewOffsetFromTop, width: drawViewWidth  , height: drawViewHeight ))
    //▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

    
    //▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
    drawView.backgroundColor = UIColor.systemTeal
    drawView.layer.cornerRadius = 12
    drawView.layer.borderWidth = 5
    drawView.layer.borderColor = UIColor.black.cgColor
    view.addSubview(drawView)
    //▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

    

    

}
//█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
0 голосов
/ 12 июля 2020

Вы можете использовать Autolayout , чтобы упростить задачу.
Удалить переопределение viewDidLayoutSubviews полностью.

Используйте следующее в viewDidLoad

override func viewDidLoad()
{
    super.viewDidLoad()
    var drawView = UIView()

    //Setup Constraints for `drawView`
    drawView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        drawView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 25),
        drawView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -25),
        drawView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 15),
        drawView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -15)
    ])

}

Редактировать : Решение без автоматического раскладки
Проблема в том, что ваш drawView добавляется несколько раз в иерархию представлений! Вы можете просто добавить его один раз и изменить только рамку.

class ViewController: UIViewController {
        
    var drawView = UIView()

    override func viewDidLoad()
    {
        super.viewDidLoad()
        view.addSubview(drawView)
        drawView.backgroundColor = UIColor.gray
        drawView.layer.cornerRadius = 15
    }


    override func viewDidLayoutSubviews()
    {


        let drawViewOffsetFromTop = max( 25 , Int( view.safeAreaInsets.top ) )
        let drawViewOffsetFromBottom = max( 25 , Int( view.safeAreaInsets.bottom ) )
        
        let drawViewWidth = Int( view.frame.size.width ) - 2*25
        let drawViewHeight = Int( view.frame.size.height) - drawViewOffsetFromTop - drawViewOffsetFromBottom
        
        drawView.frame = CGRect(x: 25 , y: drawViewOffsetFromTop, width: drawViewWidth  , height: drawViewHeight )

    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...