2017-04-10 1 views
2

私はMKMapView約300の高さを持っています。これは2つの他のビューの間で崩壊します。単純にビューを折りたたむときのように高さを上下にアニメートします。MKMapViewはゼロ高さの制約で苦労します - マップビューのedgeInsets?

enter image description here

@IBOutlet var heightMap: NSLayoutConstraint! 
@IBOutlet var theMap: MKMapView! 

ビューは、それが高さゼロの起動..

override func viewDidLoad() { 
    super.viewDidLoad() 
    .. 
    heightMap.constant = 0 
} 

それは苦労しているように見えるという腹立たしい警告...

[LayoutConstraints] 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:0x6080000904f0 MKMapView:0x7fe6b3000600.height == 0 (active)>", 
    "<NSLayoutConstraint:0x608000093a60 UILayoutGuide:0x60800018fd80'Edge Insets'.top == MKMapView:0x7fe6b3000600.top + 8 (active)>", 
    "<NSLayoutConstraint:0x608000093b50 UILayoutGuide:0x60800018fd80'Edge Insets'.bottom == MKMapView:0x7fe6b3000600.bottom (active)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x608000093b50 UILayoutGuide:0x60800018fd80'Edge Insets'.bottom == MKMapView:0x7fe6b3000600.bottom (active)> 

注意があります「edgeInsets」またはおそらく「Edge Insets」(スペースを含む)で、上端と下端、

'Edge Insets'.top == MKMapView:0x7fe6b3000600.top + 8 
'Edge Insets'.bottom == MKMapView:0x7fe6b3000600.bottom 

マップビューは.alignmentRectInsets

(私はそれが何であれ、それをプリントアウトしたときに実際には、とにかくゼロ..です

let ari = theMap.alignmentRectInsets 
print("wth \(ari)") 
> wth UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0) 

読み取り専用のプロパティを持っています私はMKMapViewで "エッジインセット"についての情報を見つけることさえできません、ここで何が取引ですか?

私は、インストールされていない制約と通常の問題を注意深くチェックしました。

+0

あなたは、高さconstriant、下部と上部レイアウト制約の両方の必要はありませんを与えている場合。そのうちの1つを削除してみてください。 – MBN

+0

こんにちは@MBN - いいえ、私は奇妙な 'Edge Insets'topと' Edge Insets 'を追加していません。これらはMKMapKit自体によって追加されたようです。 (「私の」制約はすべて完璧です)。 – Fattie

+0

これは誰も知っている信じられないほどです! – Fattie

答えて

2

興味深いことに、最初の高さがゼロの場合にのみこのエラーが発生するため、マップビューの初期設定で問題があるようです。彼らは

  1. のMapViewにストーリーボードでhieghtを与える(私は100をしました)
  2. インタフェースビルダ

で隠されたボックスをチェックして隠されたのMapViewを作ることであると考えられるソリューションMapViewを示すためにその時間:

  1. 再表示それ
  2. は、私が.ulpOfOne私に定数を設定する(これを最小化ゼロのnstead技術的にフレームが縮退することになっていませんので。)
  3. アニメイト最終位置へ

    class ViewController: UIViewController{ 
        @IBOutlet weak var m: MKMapView! 
        @IBOutlet weak var h: NSLayoutConstraint! 
        @IBAction func t(_ sender: Any) { 
         m.isHidden = false 
         h.constant = .ulpOfOne 
         view.layoutIfNeeded() 
         h.constant = 100 
         UIView.animate(withDuration: 3) { 
          self.view.layoutIfNeeded() 
         } 
        } 
    } 
    

FYI私は実際にこれをUIStackViewを使用するとだけではなく、isHiddenをアニメーション化し、その後コード内の制約に対処する必要はありません。

+0

こんにちはジョシュさんに感謝します。それはちょうどバグか何かと思われます。 ** "エッジインセット" **は不思議なままです! **。ulpOfOne **についてのあなたのヒントはいいです、ありがとうございます。 .isHiddenのスタックビューを使うというアイデアも良いことです! – Fattie

1

私は同じ問題を抱えていましたが、MKMapViewを非表示にするたびにこの警告が表示されていました(手動で高さ制約またはUIStackView内で)。私はゼロ高さの制約をアクティブにする前にマップビューの境界の高さを0に設定することによって警告を防ぐことができることに気付きました。だから私はバグをカプセル化するために少しのクラスを書いた:

import MapKit 

class HideableMapView: MKMapView { 

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 

     if self.containsZeroHeightConstraint() { 
      // Set the bounds manually before the constraint gets processed to prevent an auto layout warning 
      self.bounds.size.height = 0 
     } 

     super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
    } 

    private func containsZeroHeightConstraint() -> Bool { 
     return (self.constraints.filter { $0.firstAttribute == .height && $0.constant == 0 }).isEmpty == false 
    } 
} 

このクラスは、MKMapViewはUIStackViewに埋め込まれている私のプロジェクトのために働きました。設定によっては、別の方法を上書きする必要があります。コールスタックを表示するには、UIViewAlertForUnsatisfiableConstraintsのシンボリックブレークポイントを設定します。

は、私はまた、あなたがここに見つけることができるレーダーを提出しました:https://openradar.appspot.com/radar?id=6109127172423680

+0

レポートFelixに感謝します! – Fattie

+1

この問題はiOS 11 beta 7で解決されました。 – Felix

+0

** magnificent ** thanks @Felix! – Fattie