Swiftのビューにプログラムで制約を追加するとエラーが発生する

シネイル

Swiftのビューにプログラムで制約を追加すると、同時に満たすことができない競合する制約があることを示すエラーがログに表示されますが、UIは、シミュレーターを実行するときに意図したとおりに表示されます。スクリーンショットで。左ボタンの前縁はセグメント化されたコントロールの前縁と位置合わせされ、右ボタンの後縁はセグメント化されたコントロールの後縁と位置合わせされます。

これらの制約が問題を引き起こしていると思います。これらの2つをコメントアウトすると、エラーがスローされるのを防ぐことができますが、UIが意図したとおりに表示されません。

誰かが私が間違ったことを理解するのを手伝ってくれませんか?

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")
}

}


ログに制約エラーがある場合でも、レイアウトのスクリーンショット

バカワマ

あなたの問題はあなたがあなたMKMapViewに適切なを与えていないという事実から来ていますframeこのように作成すると:

mapView = MKMapView()

フレームを0幅と0高さに設定しています。次に、自動レイアウトは、そのフレームをビューの幅と高さの制約に変換します。

リストされている矛盾する制約の1つは次のとおりです。

<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にビューを設定させることでこの問題を回避しましたが、これは正しく行われます。


前の回答

I was not able to reproduce your problem initially, but when I put your viewController in a UITabBarController, I too saw the Auto Layout error messages.

To make it work, I used a standard UIViewController in the Storyboard and moved your loadView code into viewDidLoad. I added the MKMapView as a subview of self.view along with appropriate constraints to make it the same size as 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
    
}

Alternate solution:

  1. Move your loadView code to viewDidLoad and get rid of these lines:

    mapView = MKMapView()
    view = mapView
    
  2. In the Storyboard, change the class of the view in the ViewController to MKMapView.

  3. Make the mapView an @IBOutlet:

     @IBOutlet var mapView: MKMapView!
    
  4. Wire up the outlet in the Storyboard.

  5. MKMapViewデリゲートを設定します。Control押しながらドラッグmapViewストーリーボードのViewControllerの上部にあるアイコンviewControllerを選択し、デリゲートポップアップから。次のコマンドを呼び出して、デリゲートを接続することもできます。

    mapView.delegate = self
    

    viewDidLoad

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

プログラムでビューに制約を追加する

分類Dev

プログラムでConstraintLayoutにビューと制約を追加する方法?

分類Dev

プログラムで制約を変更するとXcodeでエラーが発生する

分類Dev

プログラムで制約のあるビューにカスタムボタンを追加する

分類Dev

Swift-プログラムで制約のある別のビューの下にTableViewを配置する

分類Dev

制約を追加するときにエラーが発生する

分類Dev

プログラムで制約なしでサブビューを追加するとどうなりますか?

分類Dev

別のプログラムでJavaプログラムを実行するとエラーが発生する

分類Dev

ClouderaHadoopでMapReduceプログラムをビルドするときにエラーが発生しました

分類Dev

プログラムで説明を追加しようとすると、Magento SQL エラーが発生する

分類Dev

プログラムで制約を作成するときのエラー

分類Dev

プログラムでLinearLayoutに複数のビューを追加中にエラーが発生しました

分類Dev

Swift:自動レイアウト制約をあるビューから別のビューにプログラムでコピーします

分類Dev

セルにサブビューを動的に追加すると、レイアウト制約エラー出力が発生します

分類Dev

このプログラムを実行するとエラーが発生するのはなぜですか

分類Dev

Swift-StackViewとプログラムでスタックに追加されたビューによる制約の追加-ロード後にセルの高さを調整しますか?

分類Dev

swiftを使用してプログラムでいくつかの制約付きの画像ビューを追加する方法は?

分類Dev

プログラムで一連のビューにレイアウト制約を設定する

分類Dev

ビューコンポーネントをプログラムで固定するとエラーが発生します

分類Dev

ビューのサイズが異なる場合にプログラムで制約を設定するにはどうすればよいですか?

分類Dev

Swift-プログラムでビューを作成するときのLazyVar vs. Let(メモリの節約)

分類Dev

Swiftでプログラム的にサブビューにUIGestureRecognizerを追加する

分類Dev

無関係な定義を追加すると、このプログラムで型エラーが発生するのはなぜですか?

分類Dev

非常に単純なCOBOLプログラムでOCCURSを使用するとエラーが発生します

分類Dev

ベクトルを参照すると、プログラムの実行時にエラーが発生します

分類Dev

64ビットLinux OSで32ビット用のプログラムをコンパイルすると、致命的なエラーが発生する

分類Dev

端末でJavaプログラムをコンパイルするとログエラーが発生する

分類Dev

IonicプロジェクトにAdMobプラグインを追加するとXcodeエラーが発生する

分類Dev

プログラムによるナビゲート:React Router V4 + Typescriptでエラーが発生する

Related 関連記事

  1. 1

    プログラムでビューに制約を追加する

  2. 2

    プログラムでConstraintLayoutにビューと制約を追加する方法?

  3. 3

    プログラムで制約を変更するとXcodeでエラーが発生する

  4. 4

    プログラムで制約のあるビューにカスタムボタンを追加する

  5. 5

    Swift-プログラムで制約のある別のビューの下にTableViewを配置する

  6. 6

    制約を追加するときにエラーが発生する

  7. 7

    プログラムで制約なしでサブビューを追加するとどうなりますか?

  8. 8

    別のプログラムでJavaプログラムを実行するとエラーが発生する

  9. 9

    ClouderaHadoopでMapReduceプログラムをビルドするときにエラーが発生しました

  10. 10

    プログラムで説明を追加しようとすると、Magento SQL エラーが発生する

  11. 11

    プログラムで制約を作成するときのエラー

  12. 12

    プログラムでLinearLayoutに複数のビューを追加中にエラーが発生しました

  13. 13

    Swift:自動レイアウト制約をあるビューから別のビューにプログラムでコピーします

  14. 14

    セルにサブビューを動的に追加すると、レイアウト制約エラー出力が発生します

  15. 15

    このプログラムを実行するとエラーが発生するのはなぜですか

  16. 16

    Swift-StackViewとプログラムでスタックに追加されたビューによる制約の追加-ロード後にセルの高さを調整しますか?

  17. 17

    swiftを使用してプログラムでいくつかの制約付きの画像ビューを追加する方法は?

  18. 18

    プログラムで一連のビューにレイアウト制約を設定する

  19. 19

    ビューコンポーネントをプログラムで固定するとエラーが発生します

  20. 20

    ビューのサイズが異なる場合にプログラムで制約を設定するにはどうすればよいですか?

  21. 21

    Swift-プログラムでビューを作成するときのLazyVar vs. Let(メモリの節約)

  22. 22

    Swiftでプログラム的にサブビューにUIGestureRecognizerを追加する

  23. 23

    無関係な定義を追加すると、このプログラムで型エラーが発生するのはなぜですか?

  24. 24

    非常に単純なCOBOLプログラムでOCCURSを使用するとエラーが発生します

  25. 25

    ベクトルを参照すると、プログラムの実行時にエラーが発生します

  26. 26

    64ビットLinux OSで32ビット用のプログラムをコンパイルすると、致命的なエラーが発生する

  27. 27

    端末でJavaプログラムをコンパイルするとログエラーが発生する

  28. 28

    IonicプロジェクトにAdMobプラグインを追加するとXcodeエラーが発生する

  29. 29

    プログラムによるナビゲート:React Router V4 + Typescriptでエラーが発生する

ホットタグ

アーカイブ