Ошибка при программном добавлении ограничений в представления в Swift

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

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

Может кто-то, пожалуйста, помогите мне понять, что я сделал неправильно?

Conversion View Controller loaded 2016-07-29 22:51:34.555 WorldTrotter[800:41503] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. ( "<NSLayoutConstraint:0x7fd836313550 UIButton:0x7fd836312e60'Current Location'.left == UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'.left>", "<NSLayoutConstraint:0x7fd836313660 UIButton:0x7fd836312e60'Current Location'.trailing == UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'.centerX - 8>", "<NSLayoutConstraint:0x7fd836318800 'UIView-Encapsulated-Layout-Width' H:[MKMapView:0x7fd83351d900(0)]>", "<NSLayoutConstraint:0x7fd836312e00 'UIView-leftMargin-guide-constraint' H:|-(0)-[UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'](LTR) (Names: '|':MKMapView:0x7fd83351d900 )>", "<NSLayoutConstraint:0x7fd833794d30 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide']-(0)-|(LTR) (Names: '|':MKMapView:0x7fd83351d900 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fd836313660 UIButton:0x7fd836312e60'Current Location'.trailing == UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'.centerX - 8> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 2016-07-29 22:51:34.556 WorldTrotter[800:41503] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. ( "<NSLayoutConstraint:0x7fd836313ee0 UIButton:0x7fd8363136b0'Next Pin'.leading == UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'.centerX + 8>", "<NSLayoutConstraint:0x7fd836313fb0 UIButton:0x7fd8363136b0'Next Pin'.trailing == UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'.trailing>", "<NSLayoutConstraint:0x7fd836318800 'UIView-Encapsulated-Layout-Width' H:[MKMapView:0x7fd83351d900(0)]>", "<NSLayoutConstraint:0x7fd836312e00 'UIView-leftMargin-guide-constraint' H:|-(0)-[UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'](LTR) (Names: '|':MKMapView:0x7fd83351d900 )>", "<NSLayoutConstraint:0x7fd833794d30 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide']-(0)-|(LTR) (Names: '|':MKMapView:0x7fd83351d900 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fd836313fb0 UIButton:0x7fd8363136b0'Next Pin'.trailing == UILayoutGuide:0x7fd83630fc20'UIViewLayoutMarginsGuide'.trailing> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

 import UIKit import MapKit class MapViewController: UIViewController, MKMapViewDelegate { var mapView: MKMapView! let locationManager = CLLocationManager() var coordinates: [CLLocationCoordinate2D] = [] var counter: Int = 0 override func loadView() { mapView = MKMapView() mapView.delegate = self view = mapView //Adding pins to map let firstLocation = CLLocationCoordinate2DMake(5.000000, -5.000000) let secondLocation = CLLocationCoordinate2DMake(-5.000000, 5.000000) coordinates.append(firstLocation) coordinates.append(secondLocation) let segmentedControl = UISegmentedControl(items: ["Standard", "Hybrid", "Satellite"]) segmentedControl.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5) segmentedControl.selectedSegmentIndex = 0 segmentedControl.translatesAutoresizingMaskIntoConstraints = false segmentedControl.addTarget(self, action: #selector(MapViewController.mapTypeChanged(_:)), forControlEvents: .ValueChanged) view.addSubview(segmentedControl) let margins = view.layoutMarginsGuide let topConstraint = segmentedControl.topAnchor.constraintEqualToAnchor(topLayoutGuide.bottomAnchor, constant: 8) let leadingConstraint = segmentedControl.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor) let trailingConstraint = segmentedControl.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor) topConstraint.active = true leadingConstraint.active = true trailingConstraint.active = true let userButton = UIButton() view.addSubview(userButton) userButton.translatesAutoresizingMaskIntoConstraints = false userButton.addTarget(self, action: #selector(MapViewController.userButtonSelected(_:)), forControlEvents: UIControlEvents.TouchUpInside) userButton.setTitle("Current Location", forState: .Normal) userButton.backgroundColor = UIColor.blueColor().colorWithAlphaComponent(0.7) let bTopConstraint = userButton.topAnchor.constraintEqualToAnchor(segmentedControl.bottomAnchor, constant: 8) //Problematic constraint I think let bLConstraint = userButton.leftAnchor.constraintEqualToAnchor(margins.leftAnchor) let bTConstraint = userButton.trailingAnchor.constraintEqualToAnchor(margins.centerXAnchor, constant: -8) bTopConstraint.active = true bLConstraint.active = true bTConstraint.active = true let pinsButton = UIButton() view.addSubview(pinsButton) pinsButton.translatesAutoresizingMaskIntoConstraints = false pinsButton.addTarget(self, action: #selector(MapViewController.pinsButtonSelected(_:)), forControlEvents: UIControlEvents.TouchUpInside) pinsButton.setTitle("Next Pin", forState: .Normal) pinsButton.backgroundColor = UIColor.blueColor().colorWithAlphaComponent(0.7) let pTopConstraint = pinsButton.topAnchor.constraintEqualToAnchor(segmentedControl.bottomAnchor, constant: 8) //Problematic constraint I think let pLConstraint = pinsButton.leadingAnchor.constraintEqualToAnchor(margins.centerXAnchor, constant: 8) let pTConstraint = pinsButton.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor) pTopConstraint.active = true pLConstraint.active = true pTConstraint.active = true } func mapTypeChanged(segControl: UISegmentedControl) { switch segControl.selectedSegmentIndex { case 0: mapView.mapType = .Standard case 1: mapView.mapType = .Hybrid case 2: mapView.mapType = .Satellite default: break } } override func viewDidLoad() { super.viewDidLoad() } func userButtonSelected(button: UIButton) { if mapView.showsUserLocation == false { mapView.showsUserLocation = true } else { mapView.showsUserLocation = false } } func pinsButtonSelected(button: UIButton) { if counter >= coordinates.count { counter = 0 } let dropPin = MKPointAnnotation() dropPin.coordinate = coordinates[counter] counter += 1 mapView.addAnnotation(dropPin) mapView.setCenterCoordinate(dropPin.coordinate, animated: false) } func mapViewWillStartLocatingUser(mapView: MKMapView) { // Ask for Authorisation from the User. self.locationManager.requestAlwaysAuthorization() // For use in foreground self.locationManager.requestWhenInUseAuthorization() if CLLocationManager.locationServicesEnabled() { locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters locationManager.startUpdatingLocation() } mapView.setUserTrackingMode(MKUserTrackingMode.Follow, animated: true) print("Tracking user") } 

}


Снимок экрана макета, даже с ошибками ограничения в журнале

One Solution collect form web for “Ошибка при программном добавлении ограничений в представления в Swift”

Ваша проблема исходит из того факта, что вы не предоставили MKMapView правильный frame . Когда вы создадите его так:

 mapView = MKMapView() 

Вы устанавливаете рамку на 0 ширины и 0 высоты. Затем Auto Layout преобразует этот фрейм в ограничения для ширины и высоты представления.

Одно из противоречащих ограничений:

 <NSLayoutConstraint:0x7fd836318800 'UIView-Encapsulated-Layout-Width' H:[MKMapView:0x7fd83351d900(0)]> 

0 в [MKMapView:0x7fd83351d900(0)] указывает, что существует ограничение на то, чтобы ширина MKMapView 0 , что, конечно, не то, что вы хотите.

Вы можете исправить это, предоставив своей карте правильный фрейм при его создании:

Заменить:

 mapView = MKMapView() 

с:

 mapView = MKMapView(frame: UIScreen.mainScreen().bounds) 

Мои ответы ниже работали над этой проблемой, позволяя iOS настроить представление, которое оно делает правильно.


Предыдущий ответ

Я не смог воспроизвести вашу проблему изначально, но когда я поместил ваш viewController в UITabBarController , я тоже видел сообщения об ошибке Auto Layout .

Чтобы он работал, я использовал стандартный UIViewController в Storyboard и переместил ваш код viewDidLoad в viewDidLoad . Я добавил MKMapView в качестве self.view вместе с соответствующими ограничениями, чтобы сделать его того же размера, что и self.view :

 override func viewDidLoad() { super.viewDidLoad() mapView = MKMapView() mapView.delegate = self mapView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(mapView) NSLayoutConstraint.activateConstraints([ mapView.topAnchor.constraintEqualToAnchor(view.topAnchor), mapView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor), mapView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor), mapView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor) ]) //Adding pins to map let firstLocation = CLLocationCoordinate2DMake(5.000000, -5.000000) let secondLocation = CLLocationCoordinate2DMake(-5.000000, 5.000000) coordinates.append(firstLocation) coordinates.append(secondLocation) let segmentedControl = UISegmentedControl(items: ["Standard", "Hybrid", "Satellite"]) segmentedControl.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5) segmentedControl.selectedSegmentIndex = 0 segmentedControl.translatesAutoresizingMaskIntoConstraints = false segmentedControl.addTarget(self, action: #selector(MapViewController.mapTypeChanged(_:)), forControlEvents: .ValueChanged) view.addSubview(segmentedControl) let margins = view.layoutMarginsGuide let topConstraint = segmentedControl.topAnchor.constraintEqualToAnchor(topLayoutGuide.bottomAnchor, constant: 8) let leadingConstraint = segmentedControl.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor) let trailingConstraint = segmentedControl.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor) topConstraint.active = true leadingConstraint.active = true trailingConstraint.active = true let userButton = UIButton() view.addSubview(userButton) userButton.translatesAutoresizingMaskIntoConstraints = false userButton.addTarget(self, action: #selector(MapViewController.userButtonSelected(_:)), forControlEvents: UIControlEvents.TouchUpInside) userButton.setTitle("Current Location", forState: .Normal) userButton.backgroundColor = UIColor.blueColor().colorWithAlphaComponent(0.7) let bTopConstraint = userButton.topAnchor.constraintEqualToAnchor(segmentedControl.bottomAnchor, constant: 8) //Problematic constraint I think let bLConstraint = userButton.leftAnchor.constraintEqualToAnchor(margins.leftAnchor) let bTConstraint = userButton.trailingAnchor.constraintEqualToAnchor(margins.centerXAnchor, constant: -8) bTopConstraint.active = true bLConstraint.active = true bTConstraint.active = true let pinsButton = UIButton() view.addSubview(pinsButton) pinsButton.translatesAutoresizingMaskIntoConstraints = false pinsButton.addTarget(self, action: #selector(MapViewController.pinsButtonSelected(_:)), forControlEvents: UIControlEvents.TouchUpInside) pinsButton.setTitle("Next Pin", forState: .Normal) pinsButton.backgroundColor = UIColor.blueColor().colorWithAlphaComponent(0.7) let pTopConstraint = pinsButton.topAnchor.constraintEqualToAnchor(segmentedControl.bottomAnchor, constant: 8) //Problematic constraint I think let pLConstraint = pinsButton.leadingAnchor.constraintEqualToAnchor(margins.centerXAnchor, constant: 8) let pTConstraint = pinsButton.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor) pTopConstraint.active = true pLConstraint.active = true pTConstraint.active = true } 

Альтернативное решение:

  1. Переместите код loadView в viewDidLoad и избавитесь от этих строк:

     mapView = MKMapView() view = mapView 
  2. В раскадровке измените класс view в ViewController на MKMapView .

  3. Сделайте mapView @IBOutlet :

      @IBOutlet var mapView: MKMapView! 
  4. Подключите розетку к раскадровке .

  5. Установите делегат MKMapView . Control -drag from mapView в Storyboard к значку ViewController в верхней части viewController и выберите делегата из всплывающего окна. Вы также можете подключить делегата, позвонив:

     mapView.delegate = self 

    in viewDidLoad .

  • Динамический размер заголовка UICollectionView на основе UILabel
  • Экран камеры показывает только чистое черное изображение
  • Swift 3 / Как совместить UINavigationBar Root с UINiewController UINavigationBar
  • PFFile для PFImageView
  • Объявление глобальных переменных в Swift
  • Xcode & Swift - обнаружение пользовательского касания UIView внутри UIScrollView
  • Найти процесс загрузки файла в быстром
  • Что использует UIControlState «приложение» UIButton?
  • Статический UITableView, создайте отдельную ячейку с динамической высотой в Swift
  • NSXMLParser didStartElement Получение атрибутаDict
  • Почему нельзя назначить @IBOutlet let вместо var в Swift?
  • Interesting Posts

    Печать NSString из NSData и сравнение хешей HMAC

    Настройка формата аудиоустройства и обратного вызова рендеринга для чередующихся аудиосигналов PCM

    как поддерживать пользовательскую графику в iPhone 5

    ограничения автоопределения, не помещающие контейнерный вид должным образом

    Содержит CoreDataOffjectContext Сохраняет ограничение UNIQUE для Z_PK

    Как рассчитать FOV?

    iOS 5: UITabBarItem setFinishedSelectedImage: withFinishedUnselectedImage: не работает / игнорируется

    Веб-страница не отображается с помощью WkWebView и Swift в iOS

    Статическая библиотека iOS, скомпилированная с Xcode, запоминает исходные файлы

    React-Native fetch, сетевой запрос не выполнен. не использовать localhost

    Невозможно изменить размер UIButton

    .Net UserControl XCode эквивалент

    UITableView не прокручивается, а достаточно высотой

    Свойство не может быть найдено в объекте прямого класса

    Позиция Fixed и iFrame на Mobile Safari

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.