2017-09-21 31 views
7

私のアプリケーションはすでにアプリストアにありますが、昨日私のXcodeバージョンを9にアップデートしました。iPhone x以外は正常に動作します。 UIが崩壊しました。iOS 11 iPhone用安全領域のレイアウトガイド

1.Here私は2つののUIView(両方とも高さが固定されている)ヘッダとして命名され、タブバーを作成していると私は私のNavigationBar全体のアプリを非表示になっています。そのタブバーのように

self.addHeaderTab(currentViewController: self, content:"நிகழ்ச்சி நிரல்" , isMenu: true) 

ヘッダータブバー

func addHeaderTab(currentViewController:UIViewController,content:String, isMenu:Bool){ 
     let noView = TopHeaderView() 
     noView.tag = 12345 
     noView.isMenu = isMenu 
     noView.translatesAutoresizingMaskIntoConstraints = false 
     currentViewController.view .addSubview(noView) 
     if isMenu{ 
      noView.menuBtn .setImage(UIImage(named: "Small"), for: .normal) 
      noView.logoImg.isHidden = false 

     }else{ 
      noView.menuBtn .setImage(UIImage(named: "arrow_small"), for: .normal) 
      noView.logoImg.isHidden = true 
     } 
     noView.titleLbl.text = content 
     noView.delegate = (currentViewController as! menuOpen) 

     NSLayoutConstraint(item: noView, attribute: .leading, relatedBy: .equal, toItem: currentViewController.view, attribute: .leading, multiplier: 1.0, constant: 0.0).isActive = true 

     NSLayoutConstraint(item: noView, attribute: .trailing, relatedBy: .equal, toItem: currentViewController.view, attribute: .trailing, multiplier: 1.0, constant: 0.0).isActive = true 

     NSLayoutConstraint(item: noView, attribute: .top, relatedBy: .equal, toItem: currentViewController.view, attribute: .top, multiplier: 1.0, constant: 0.0).isActive = true 

     NSLayoutConstraint(item: noView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: 64).isActive = true 

    } 

と以下のようにすべてののViewControllerこれを呼び出しを行うためのUIViewController

2.Added拡張私もやったが、すべてのデバイスは期待通りに働いている。iPhone x。私はおよそhttps://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/

を学んだが、その文書で明確ではありませんよき

Image

は私のスクリーンショットを参照してください。

お願いします。ありがとうございます。

答えて

13

iOS11(およびiPhoneXの外観)では、Appleは安全領域レイアウトガイドを導入して、iPhoneXにビューを適合させました。

セーフエリアは、ノッチまたはホームインジケータによって重ならない画面の領域です。あなたはiOS11のためのあなたのnoViewのトップ制約を変更する必要が発生している問題を回避するために

enter image description here

if #available(iOS 11, *) { 
    let guide = view.safeAreaLayoutGuide 
    NSLayoutConstraint.activate([ 
     noView.topAnchor.constraint(equalTo: guide.topAnchor) 
    ]) 
} else { 
    NSLayoutConstraint.activate([ 
     noView.topAnchor.constraint(equalTo: currentViewController.topLayoutGuide.bottomAnchor) 
    ]) 
} 
NSLayoutConstraint.activate([ 
    noView.leadingAnchor.constraint(equalTo: currentViewController.view.leadingAnchor), 
    noView.trailingAnchor.constraint(equalTo: currentViewController.view.trailingAnchor), 
    noView.heightAnchor.constraint(equalToConstant: 65) 
]) 

は、残念ながら、それがすべてではありません。今あなたのnoViewがiPhone X上に移動しますが、ステータスバーにはもう赤い背景がありません。

enter image description hereenter image description here

あなたはUINavigationControllerを使用して、非常に簡単なものを作ることができる(赤ナビゲーションバーで):あなたは、ステータスバーの後ろに赤い背景色を追加してい

enter image description hereenter image description here

この方法では、制約を設定する必要はありません。システムは自動的にすべての調整を行います。上部と下部の余白のためのObjective-Cでは

+0

あなたは非常に助けてくれました、ありがとうございました。カスタムUIViewをナビゲーションバーにロードする方法はありますか?もしあれば問題はない、そうですか?これについては何か考えてください – karthikeyan

+0

もちろん、ビューコントローラの 'UINavigationItem'(ビューコントローラがナビゲーションコントローラに組み込まれている場合)を使ってナビゲーションバーをカスタマイズすることができます。ボタンアイテムとタイトルビュー(任意の 'UIView ')を追加できます。これらのドキュメントを見てください:https://developer.apple.com/documentation/uikit/uinavigationitem – joern

+0

タイトルビューにxibとサブビューをロードしようとしましたが、例外として動作していません – karthikeyan

2

あなたがUINavigationControllerを使用する必要はありませんが、あなたは、ナビゲーションバーを持つようにしたい場合はiPhone-X

if (@available(iOS 11, *)) { 

    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.childView 
                      attribute:NSLayoutAttributeBottom 
                      relatedBy:NSLayoutRelationEqual 
                      toItem:self.parentView.safeAreaLayoutGuide 
                      attribute:NSLayoutAttributeBottom 
                     multiplier:1.0 
                      constant:0]; 


    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.childView 
                    attribute:NSLayoutAttributeTop 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:self.parentView.safeAreaLayoutGuide 
                    attribute:NSLayoutAttributeTop 
                    multiplier:1.0 
                    constant:0]; 


} else { 

    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.childView 
                     attribute:NSLayoutAttributeBottom 
                     relatedBy:NSLayoutRelationEqual 
                     toItem:self.parentView 
                     attribute:NSLayoutAttributeBottom 
                    multiplier:1.0 
                     constant:0]; 


    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.childView 
                    attribute:NSLayoutAttributeTop 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:self.parentView 
                    attribute:NSLayoutAttributeTop 
                    multiplier:1.0 
                    constant:0]; 

} 
関連する問題