web-dev-qa-db-ja.com

iOS Autolayout-ビュー間の2つの異なる距離を設定する方法、画面の高さに依存

これは簡単に達成できるものでなければならないので、私は何かが欠けていることを知っています。

私の問題は、「ロード画面」(スプラッシュの直後に表示される画面)に、サイズが3.5インチと4インチの2つの異なる画像を持つUIImageViewがあることです。その画像の特定の場所に、1つのUIActivityIndi​​catorを配置して、アプリがバックグラウンドで何かを読み込んでいることをユーザーに伝えます。その場所は両方の画像で同じではありません。一方の画像が明らかに他方の画像よりも高いため、アプリが実行されているかどうかに応じて、アクティビティインジケータを異なる高さに配置できるようにする自動レイアウト制約を設定しますiPhone 5かどうか。

Autolayoutを使用しない場合、ビューのframe.Origin.yを300(たとえば)に設定し、ViewControllerのviewDidLoadメソッドで、アプリがiPhone 5で実行されているかどうかを尋ねるので、 dたとえば、値を350に変更します。Autolayoutを使用してこれを行う方法がわかりません。

36
Daniel

View ControllerにNSLayoutConstraintアウトレットを作成し、アウトレットをxibまたはストーリーボードのアクティビティインジケーターのY制約に接続できます。次に、updateViewContraintsメソッドをView Controllerに追加し、画面サイズに応じて制約の定数を更新します。

connecting constraint to outlet

updateViewConstraintsの例を次に示します。

- (void)updateViewConstraints {
    [super updateViewConstraints];
    self.activityIndicatorYConstraint.constant =
        [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}

もちろん、200および100の代わりに適切な値を入力する必要があります。いくつかの名前付き定数を定義することもできます。また、[super updateViewConstraints]を呼び出すことを忘れないでください。

109
rob mayoff

@Robの答えの問題は、各制約に対して多くのコードを実行する必要があるということです。したがって、それを解決するには、コードにConstraintLayoutクラスを追加し、IBで必要なデバイスの制約定数値を変更するだけです。

enter image description here

//
//  LayoutConstraint.Swift
//  MyConstraintLayout
//
//  Created by Hamza Ghazouani on 19/05/2016.
//  Copyright © 2016 Hamza Ghazouani. All rights reserved.
//

import UIKit

@IBDesignable
class LayoutConstraint: NSLayoutConstraint {

    @IBInspectable
    var ????3¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 480 {
                constant = ????3¨5_insh
            }
        }
    }

    @IBInspectable
    var ????4¨0_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 568 {
                constant = ????4¨0_insh
            }
        }
    }

    @IBInspectable
    var ????4¨7_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 667 {
                constant = ????4¨7_insh
            }
        }
    }

    @IBInspectable
    var ????5¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 736 {
                constant = ????5¨5_insh
            }
        }
    }
}

ConstraintLayoutからクラス制約を継承することを忘れないでくださいObjective-cバージョンをすぐに追加します

17
Hamza

UIオブジェクトの位置を管理する自動レイアウトの基本ツールは、制約です。制約は、2つのビュー間の幾何学的関係を表します。たとえば、「プログレスバーの右端は、40ポイントのラベルの左端に接続されている」という制約があります。

つまり、AutoLayoutを使用すると、UIDeviceのモードに基づいて条件付き位置設定を行うことはできません。代わりに、たとえば、アプリは、制約に基づいて3.5 'フルスクリーン(IPhone4)または4'フルスクリーン(IPhone5)で実行されます。

したがって、制約を使用した問題のオプション:

1)プログレスバーを相対的に配置するための制約を作成するために使用できるレイアウトのビューを見つけます。 (CMDボタンを使用してビューとプログレスバーを選択し、エディター/ピン/垂直間隔メニュー項目を使用して2つのオブジェクト間に垂直制約を作成します)

2)プログレスバーの位置を画面の端(スペースを保持する)または中央に固定する絶対制約を作成します

あなたにとっても有益なAutoLayoutについてのこのチュートリアルが役に立ちました: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

Pls注:自動レイアウトはIOS 6。

1
nzs

私は通常、制約を設定するために常にInterface Builderに留まるようにしています。たとえば、iPhone 4と6で完全に異なるレイアウトを使用している場合、より詳細に制御するためにコードをダイブすると便利です。

前述したように、Interface Builderでは条件を使用できません。これは、制約をView Controllerにリンクすることが本当に便利な場合です。

さまざまな画面サイズの自動レイアウトの問題を解決する3つのアプローチについて簡単に説明します。 http://candycode.io/how-to-set-up-different-auto-layout-constraints-for-different-screen -sizes /

0
Jure