Попытка реализовать MKMapView программно в кадре - PullRequest
0 голосов
/ 14 марта 2020

Я создаю приложение, используя Swift 5, Xcode 11.3.1. Первоначально я создал приложение с использованием раскадровки в Swift, однако сейчас я работаю через приложение, реализуя метки, текстовые поля, палитры, переключатели, кнопки и т. Д. c программно. Однако, я столкнулся с загадкой, пытаясь программно кодировать одну из моих сцен с использованием MKMapView, который я создал изначально с раскадровкой.

Когда я создавал с использованием раскадровки, мой экран / сцена делится на 3 секции / области с первыми 100 точками (CGFloat pts), используемыми для отображения некоторого текста. Тогда у меня есть MKMapView от pt 106 с высотой 413pt. MKMapView простирается до краев и, таким образом, представляет собой квадрат (i sh) ... Нижняя часть экрана / сцены используется для отображения некоторого текста, пары UIS-переключателей и пользовательской кнопки. В MKMapView у меня также есть маркер, который отображает центральную точку и местоположение пользователя, чтобы пользователь мог прокрутить карту к другой точке на карте, которая обозначена маркером в центре карты.

Итак, вот где все идет не так ... Я пытаюсь определить тот же тип внешнего вида для MKMapView программно, однако он продолжает отображать карту в полноэкранном режиме и поэтому перезаписывает верхнюю и нижнюю области, которые я использую для отображения текста и кнопок. Я не смог понять, почему MKMapView не придерживается установленного кадра или ограничений. Моя первая попытка состояла в том, чтобы определить фрейм, однако затем я немного прочитал и решил, что мне нужно также кодировать ограничения. Однако теперь, когда приложение запускает ограничения (первое из них), приложение запускается с ошибкой ....

2020-03-14 21: 43: 57.509878 + 1100 MyGarageApp [17060: 95627 ] * Завершение работы приложения из-за необработанного исключения «NSGenericException», причина: «Невозможно активировать ограничение с помощью якорей, и потому что у них нет общего предка. Указывает ли ограничение или его привязки на элементы в разных иерархиях представления? Это незаконно. * Первый стек вызовов вызовов:

Вот мой код для отображения карты:

[Этот фрагмент кода находится перед моим viewDidLoad]

 // Early IBOutlets required to define the scene
var theMapView: MKMapView!

@IBOutlet weak var addressLabelOutlet: UILabel!


let centerMapButton: UIButton = {
    let button = UIButton(type: .system)
    button.setImage(UIImage(named: "MapPointer.png"), for: .normal)
    button.addTarget(self, action: #selector(handleCenterOnUserLocation), for: .touchUpInside)
    button.translatesAutoresizingMaskIntoConstraints = false
    return button
}()

следующий фрагмент кода - это метод после моего раздела viewDidLoad (ie. внутри моих методов тела) ...

func configureMapView() {

    theMapView = MKMapView(frame: CGRect(x: 0, y: 106, width: self.view.frame.width, height:413))

    theMapView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
    theMapView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 106).isActive = true
    theMapView.heightAnchor.constraint(equalToConstant: 413).isActive = true
    theMapView.widthAnchor.constraint(equalToConstant: 355).isActive = true

    theMapView.showsUserLocation = true
    theMapView.userTrackingMode = .follow

    theMapView.frame = view.frame
    view.addSubview(theMapView)
}

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

Заранее благодарю всех.

1 Ответ

1 голос
/ 14 марта 2020

Прежде всего, для использования ограничений необходимо установить translatesAutoresizingMaskIntoConstraints на false. Во-вторых, вы устанавливаете фрейм карты, чтобы он начинался с x = 0, но затем устанавливаете ведущее ограничение на x = 10, что означает, что эти два будут конфликтовать друг с другом.

Кроме того, ограничения могут только быть добавлен, как только представление было добавлено в иерархию представлений, поэтому переместите свои ограничения ниже линии view.addSubview().

После того, как вы добавили свои ограничения, попробуйте вызвать theMapView.layoutIfNeeded(), чтобы фактически вызвать повторную компоновку представление карты.

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

...