web-dev-qa-db-ja.com

Xcode-フレームを失うことなく、あるビューから別のビューにコンポーネントをドラッグする方法はありますか?

私がやりたいのは、フレーム/位置をリセットせずに、Xcodeのインターフェイスビルダーであるスーパービューから別のスーパービューにコンポーネント/ビューをドラッグすることです。

これを行うときのXcodeのデフォルトの動作は、寸法を保持しながら、新しいスーパービューで垂直および水平に移動されるビューを中央に配置するように見えます。これは、ビューを新しいスーパービューで手動で再配置する必要があるため、非常にイライラします。しかし、移動する前に正しく配置していたので、Xcodeに幅/高さだけでなく、フレームのすべての属性のみを記憶させたいと思います。これは可能ですか?

86
aroth

別の解決策:

  1. サブビューで必要なアイテムを選択してから、
  2. (ツールバー内)Editor-> Embed In->埋め込むビュータイプ.
213
Jay

私はあなたたちを助けるかもしれない何かを見つけました!

タスクは、「子ビュー」を「親ビュー」に再グループ化して、それらが階層的に親ビューの子になり、アクション前のようにディスプレイ上の物理的な位置を保持することです。

まず、親ビューを調整して、子ビューの領域を物理的にカバーします。次に、ビューリストですべての子がそれより下にあることを確認します。

次に、すべての子をマウスで選択して移動します。上に1ピクセル、下に1ピクセル(IBに変更があると言うだけです)。その後、子供を解放すると、彼らは魔法のように親の子供になり、その位置を表示し続けます。

OSX 10.8.2およびXcode 4.6で動作します。

がんばろう!

28
vedrano

私はなんとかしてものの再配置に費やす時間を節約し、これを行いました:

  1. Interface Builderで、サブビューと同じレベルに親ビューを追加します。
  2. テキストエディタでストーリーボードを開き、親ビューのサブビュータグ内のサブビューをコピーします。 XCodeは、保存すると更新されます。

それほどエレガントではありませんが、なぜXCodeがShiftなどでサポートしていないのかわかりません。

22
Stepan Hruda
  1. あるUIViewから別のUiView(nay be child)またはScrollViewに移動するすべてのコントロールを選択します。

  2. 切り取り/コピー

  3. 新しいUIView/ScrollViewを既存のUIViewにドラッグした後、一度クリックして選択するのではなく、新しいUIView/ScrollViewをダブルクリックしてすべてのコントロールを貼り付けます。

  4. 距離の差はすべてのコントロール間で同じままですが、コントロールを再度配置する必要がある場合があります。そのため、それらの位置を変更するまでクリックしないでください。すべてのコントロールは既に選択されているため、ナビゲーション矢印ですべての位置を変更するか、再度選択することができます。

注:XCode 4.2を使用しています

10

ストーリーボードを使用せずに、Stepanのソリューションに似た何かをしました。 ViewControllerのビューが開いている間にIBで:

  1. VCのメインビューに加えて別のビューを作成する
  2. すべてのサブビューを1つのビューから別のビューにドラッグして2番目のビューに移動します(左側のリストからドラッグすると位置がリセットされます)マウスを使用してIBからサブビューを選択できない場合、左側のリストからすべてを選択してから、 「cmd」ボタンを使用して、IBパネルから最後のサブビューを1つ選択します。
  3. 最初のメインビューの最終ビューに戻します。
  4. 追加されたビューをすべて削除します。
4

Xcode Interface Builderは、親ビューが別のビュー(UIView、ScrollView、StackView)にドラッグアンドドロップされると混乱します

Q:
ビュー(その中に他の多くのサブビューを含む)をScrollViewまたは別のトップレベルビューに埋め込むのは、これまで見たものとは簡単ではありません。すぐに起こるのは、元のフレームが見つからなかったために、すべてのサブビューが置き忘れられているように見えることです。

A:
次の手順を実行すると、できるだけ簡単に解決できるようになります。

  1. サブビューで必要なアイテムを選択してから、
  2. メニューバーに移動し、エディタ->埋め込み->表示
  3. この新しいビュー(Cmd + C)をサブビューとコピーします(私にとっては、現在のところ、この時点ですべての制約が保持されています)
  4. サブビューを配置するビュー(ScrollViewでもStackViewでもかまいません)に移動して、コピーしたビューを貼り付けます(Cmd + V)
  5. 貼り付けた埋め込みビュー(以前に新しく作成した)を選択し、Xcodeのメニューバーに移動、エディター->埋め込みなし

いいえ、まだ終了していません!UI Constraintに関連する問題がさらに少ないことを経験する場合がありますが、それに応じて解決する必要があります。

2
Randika Vishman

これは、サブビューを別のビューにコピーし、位置を保持するための最良のソリューションです。

  1. サブビューで必要なアイテムを選択してから、
  2. エディター->埋め込み->表示
  3. このビューをコピー(Cmd + C)
  4. 元に戻す(Cmd + Z)(サブビューが必要なため)
  5. サブビューが必要なビューに移動して貼り付けます(Cmd + V)
  6. コピーして貼り付けた埋め込みビューを選択し、Editor-> Unembed

手順6では、埋め込みビューが削除され、サブビューのみがコピーされます。

2
Dhruv Goel

別のアプローチを見つけました。基本的には:Move = Cut + Paste

このようにして:

  • すべてのサブビューを新しい親ビューの子にする(P ')
  • (ほぼ)すべての制約を自動レイアウトベースのストーリーボードに保持する
  • サブビューの相対的な位置(フレーム)を相互に保持する

このようにしない:

  • テキストエディターでストーリーボードファイルを編集する

基本は、ストーリーボードの1つ(ルート)以外の各ビュー親ビューがあるです。次に、複数のサブビューをコピー/移動すると、フレームと制約を失いますになります。

答えは非常に簡単です。親ビュー(P)を新しい親ビュー(P ')にコピーして、サブビュー(SV)のコピーを作成します。この方法では、親の新しいビュー(P ')からその新しい親ビューへの制約のみを再作成する必要がありますが、移動するすべてのサブビューについては再作成する必要はありません。

親ビュー(P)を新しいビュー(P ')にコピーした後、その新しいビュー(P')から以下を実行します。

  • 移動したい子を除くすべての子を削除します
  • 新しい親(P ')制約を再作成します
  • 可能なInterface Builderアウトレットを(SV's)に再作成します

元の親ビュー(P)から:

  • 移動したいすべての子を削除します

前:

View1

View2

P

移動したいSV

移動したくないSV

View3

後:

View1

View2

P

移動したくないSV

View3

P '

移動したいSV

あなたが持っている場合、これはうまく一般化しないことを強調する必要があります親ビューとしてのUIScrollView。そして、そのコピーは再びUIScrollViewになりますが、これは望ましくない場合があります。

別のことは、元の親ビュー(P)でサブビュー(SV)の一部を削除するとき、他の(移動できないサブビュー)がそれらを参照している場合、いくつかの制約を再作成する必要がある場合があります。しかし、とにかくそれを行う必要があります。

1
vedrano