0

これが初めての試みであっても、Autolayouts を使用するのは初めてです。何をするにしても、結果として白い画面で終わります。これが私の試みです。

UIViewparentViewはフレームを持ってい(60, 154, 200, 200)ます。へのサブビューself.viewです。

次に、フレームの動的ビューと、のサブビューであるフレームのdynamicView動的ビューがあります。(0, 0, 260, 100)label(15, 25, 230, 50)dynamicView

dynamicViewas サブビューをに追加するとparentViewparentViewの範囲外になります。dynamicViewそのため、とその child( label) のサイズを調整して、その位置が の中心になり、parentViewの境界のdynamicView内側になるようにしたいと思います。parentView

私の最初の試みは設定clipsToBoundsでしたが、Xcode5、iOS7では機能しません。したがって、次のオプションは、 を使用してこれを実現することNSLayoutConstraintです。私はそれについて何も知りません。あなたのアイデアを歓迎します。

4

2 に答える 2

2

私は、parentViewの問題の一部であるdyanmicViewに対処し、そこから先に進みます

最初:ビューを動的に作成している場合は問題ありませんが、ストーリーボードから作成した場合は、親から切り離してから再接続する必要があります..それを取り除く方法です新しいものと競合する可能性のある以前の NSConstraints (通常はストーリーボードで導入されます)。

setTranslatesAutoresizingMaskIntoConstraintsまた、nsconstraints に干渉する可能性がある NO b/c に設定する必要があります。

私は通常、 mapObjectsUsingBlockを使用して、最後の 2 つの手順を次のように行います。これにより、制約を作成するという面倒なプロセス全体が、より快適で自然になります。

    [@[view_1, view_2, /../, view_n] mapObjectsApplyingBlock:^(UIView *view) {
        [view removeFromSuperview];
        [view setTranslatesAutoresizingMaskIntoConstraints:NO];
        [view setHidden:NO];
        [superView addSubview:view];
    }];

次に、nsconstraints を適用する前に、制約を適用するビューが既にその親にアタッチされていることを確認する必要があります。

[parentView addSubview:dynamicView];

次に、バインディング ディクショナリを作成します。

NSDictionary *buttonBindingsDictionary = @{ @"parentView" : parentView,
                                            @"dynamicView" : dynamicView};

次に、ビジュアル フォーマット言語を使用して制約を追加します。ここでも使用mapObjectsUsingBlockします (各制約について英語で説明します)。

NSArray *buttonConstraints = [@[@"V:|-[dynamicView(>=200)]-|",
                                @"|-[dynamicView(>=260)]-|",
                                ] mapObjectsUsingBlock:^id(NSString *formatString, NSUInteger idx){
    return [NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:buttonBindingsDictionary];
}];

V:|-[dynamicView(>=200)]-|dynamicView垂直に言えば..とその親の間の上下の距離が等しくなければならないことを意味します.. また、dynamicView's高さはそれ以上でなければなりません200

|-[dynamicView(>=260)]-|dyanmicview水平に言えば..とその親の間の左右の距離が等しくなければならないことを意味します..また、dyanmicView's幅はそれ以上でなければなりません260

注:自分で計算して、dyanicView親との間の左/右/下/上の距離を正確に設定できます..これは単純です..しかし、nsconstraints が台無しになることがあるので、自分でやらなければなりません。

その場合、x思いついた距離は次のようになります。

V:|-x-[dynamicView(>=200)]-x-|
|-x-[dynamicView(>=260)]-x-|

次に、制約を親ビューに追加する必要があります。

[parentView addConstraints:[buttonConstraints flattenArray]];

ここで、 flatten arrayを使用したことに注意してください。これは、ライブラリ b/ci のメソッドであり、配列の配列ではなく、1 レベルの配列をフィードする必要があります。

そして、あなたは行く準備ができています!

注:これが完全に機能しない可能性があることはわかっています..しかし、何をすべきか+いくつかのヘルパーファイルのアイデアが得られます。ある程度の練習が必要です。確かにいくつかのチュートリアルを確認する必要があります..ストーリーボードを使用してnsconstraintsから始めることをお勧めします(ビューを選択できます..次にエディタ>ピン>..に移動し、何かを選択しました..すぐに入手してください視覚的なフィードバック.. また、View Controller を選択し、属性インスペクターに移動して、シミュレートされたメトリックの下で異なるサイズを選択することにより、ストーリーボードですぐにビューが 3.5 インチ ディスプレイと 4.0 インチ ディスプレイでどのように見えるかをシミュレートできます)。

時間はかかりますが、確かなことが 1 つあります。一度 nsconstraints を実行すると、後戻りすることはありません。それは完全に価値があります!

ps nsconstraints を使用してビューをアニメーション化することもできます..念のため。

于 2013-10-08T09:59:02.237 に答える
0

Auto Layout Constraints は、達成しようとしているものに対する最良のアプローチです。IB で [自動レイアウトを使用] オプションをオンにすると、自動レイアウト制約が自動的に追加されます。

iOS6 http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2の自動レイアウトについて詳しく説明しているこのチュートリアルをチェックして ください。

次に、iOS7 http://www.doubleencore.com/2013/09/auto-layout-updates-in-ios-7/で更新された自動レイアウトのこのリンクを確認できます。

于 2013-10-08T09:43:45.093 に答える