UIView.transform - констрейнты игнорируют safe area


#1

Вот таким вот образом прячу вьюху за экраном:

view.transform = CGAffineTransform(translationX: view.frame.width, y: 0)

Когда необходимо возвращаю на место:

view.transform = CGAffineTransform(translationX: 0, y: 0)

Но при повороте экрана, элементы которые находятся внутри распологаются не верно, они не учитывает safeArea. Т е смотрите, изначально они учитывает safeArea, а потом после повороте не учитывают… Почему так?


#2

Сделайте управляймый констрейнт


#3

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


#4

____________ это как?


#5

я не совсем понимаю, что вы имеете ввиду? Ну типо на то он и констрейнт, что он автоматическии сам должен подстраиваться под экран. Чем я могу там управлять? Его временное за кадром устанавливать с помощью констрейнта - не оч удобно и красиво… все таки интересно в чем причина… на будущее


#6

Примерно так

var topConstaraints: NSLayoutConstraint?
func setupUI() {
    topConstaraints = bottomView.topAnchor.constraint(equalToSystemSpacingBelow: view.safeAreaLayoutGuide.topAnchor)
    topConstaraints?.isActive = true
}
func animation() {
    self.topConstaraints?.constant = 12
    UIView.animate(withDuration: 0.3, animations: {

        self.view.layoutIfNeeded()
    }) { (_) in
        
    }
}

#7

Возвращать лучше так

self.view.transform = .identity

#8

такой вариант мне не подходит(

Еще такой момент забыл подметить, что проблема в дочернем контроллере


#9

Еще раз более точно сформулирую проблему:

в дочернем контроллере вставки безопасной области не учитываются для объектов, которые находятся за пределами границ view. Но когда я возвращаю обратно в границы объекты, вставки все равно не обновляются, необходимо перезагрузить констрейнты. Но мне не подходит перезагружать их, ибо получается это будет происходит после анимации, тогда получится скачок с одного места на другое…


#10

[РЕШЕНО]

view.transform = .identity
view.setNeedsLayout() // Делает недействительным макет слоя и помечает его как нуждающийся в обновлении

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

view.setNeedsLayout()