Swift 4, ориентация устройства - PullRequest
0 голосов
/ 05 декабря 2018

Я создаю приложение ArKit + CoreLocation, которое при касании узла отображает некоторую информацию в представлении на экране.Проблема в том, что когда я поворачиваю устройство, я перерисовываю DataView, но рисую неправильно.

Первое, что я заметил, это то, что когда я запускаю приложение, и телефон находится в портретном режимеЯ должен оценить if(!UIDevice.current.orientation.isPortrait ), чтобы получить правильные размеры для этого случая. Почему во время запуска ориентация не портретная?

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

Я сделал видео, чтобы показать вам, что происходиттакже, чтобы узнать, когда выбран узел, вокруг него есть фиолетовый круг.И вы увидите, что после переориентации, не имеет значения, к какому узлу я прикасаюсь, я не могу обновить текст.https://youtu.be/ls_Y6dnW8E4

Мой исходный код

/*
 * Initialize the TextView to display the information about the monument
 */
func initDataView() {

    let screenWidth = self.view.frame.width
    let screenHeight = self.view.frame.height
    var leftPadding : CGFloat = 0.0
    var bottomPadding : CGFloat = 0.0
    var frameHeight : CGFloat = 0.0

    /*
     * Configure paddings if the device is a phone
     */
    if (UIDevice.current.userInterfaceIdiom == .phone) {

        if ( UIDevice.current.orientation.isPortrait ) {
            (leftPadding, bottomPadding, frameHeight) = getDataViewPaddings(phone: true, portrait: true, screenWidth: screenWidth, screenHeight: screenHeight)
        } else {
            (leftPadding, bottomPadding, frameHeight) = getDataViewPaddings(phone: true, portrait: false, screenWidth: screenWidth, screenHeight: screenHeight)
        }

    }

    dataView = UIView(frame: CGRect(x: 0, y: 0, width: screenWidth-(leftPadding*2), height: screenHeight/frameHeight))
    dataView.frame.origin.x = leftPadding
    dataView.frame.origin.y = screenHeight - dataView.frame.height - bottomPadding
    //dataView.backgroundColor = UIColor.white.withAlphaComponent(0.7)

    //Adjust border and border color
    dataView.layer.borderWidth = 4.0
    dataView.layer.borderColor = UIColor(hexString: "#951789ff")?.cgColor

    initTextView(leftPadding: leftPadding)

    dataView.addSubview(textView)
    dataView.addSubview(descriptionView)
    dataView.addSubview(iconView)

}

public override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    initDataView()
}

1 Ответ

0 голосов
/ 05 декабря 2018

Использование UIKit UIViews с ARkit ARSCNView ничем не отличается от любого другого представления.Если вы устанавливаете пользовательские кадры, этот код должен быть выполнен в viewDidLayoutSubviews.В этом случае, похоже, вы просто хотите закрепить вид на некотором расстоянии от переднего края и дна с постоянной шириной и высотой.Если это то, что вы хотите, тогда просто используйте autolayout и позвольте механизму макета вычислить позицию.это работает в коде или построителе интерфейса.Вы также можете вручную установить класс UIView в ARSCNView в конструкторе интерфейсов.

...