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


91

フレーム/位置をリセットせずに、Xcodeのインターフェースビルダーでコンポーネント/ビューをあるスーパービューから別のスーパービューにドラッグします。

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


過去の時間に、フレームを切り取って貼り付けた場合、同じままでした。試してみてください。
David H

提案をありがとう、残念ながらそれは動作しないようです。それ以外の場合は、切り取り/貼り付けを間違えているだけです。XCodeは、貼り付けようとしているビューを貼り付けているビューに置き換えます(一度に複数のものを貼り付けようとすると、リストの最初のアイテムのみが使用されます)。コピーは同じことを行います。
12

左側の列-リストに貼り付けてみてください。スーパービューを選択して貼り付けます。そうでなければ、申し訳ありませんが、提案から。
デビッドH

両方の方法を試しました。動作しません。結局それを難し​​い方法でやらなければならなくなった。
12

stackoverflow.com/questions/12034293/…に回避策があるようですが、それはあまり良くありません
Eugene Osovetsky

回答:


223

別の解決策:

  1. サブビューで必要なアイテムを選択してから、
  2. (ツールバー)エディター>埋め込み>埋め込み先のビュータイプ。

12
ありがとう。これは受け入れられる答えになるはずです。新しいスーパービューに移動するすべてのビューを選択->ビューに埋め込む->新しいコンテナビューを目的のスーパービューに移動->エディタ-埋め込み解除。出来上がり!すべてのビューは、正しいフレームを持つ新しいスーパービューにあります。
Accatyyc 2013

18
自動レイアウト制約がコピーされないのは残念です。私が見た唯一の方法は、xibのxmlを手動で編集することです。indiestack.com/ 2013/12
James

1
まだ奇妙なのは、サブビューを新しいスーパービューに埋め込むと、スーパービューの座標がおかしいということです。-20 xと-20 yで始まり、0,0に設定すると、すべてが中心から外れます。
user3344977 2015

1
@ジェームズ私は以前それをしていました。しかし、Xcode 6でCommand-X_Command-Vビューを使用すると、貼り付けたビュー間の制約が尊重されることがわかりました。小さな改善。
Steven Kramer

4
@StevenKramer Command-XとCommand-Vで試してみましたが、うまくいきませんでした。これを行うための手順は他にありますか?興味ある
2015年

28

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

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

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

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

OSX 10.8.2とXcode 4.6で動作します。

幸運を!


すごい...これはアウトレットやフレームを壊すことさえありません。ビューに埋め込むとフレームが壊れます。カットペースト法は、アウトレットとフレームを壊します。
jeet.chanchawat

22

私はものを再配置することに費やされた多くの時間を節約することに成功し、これを行いました:

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

あまりエレガントではありませんが、XCodeがShiftなどでサポートしていない理由はわかりません。


3
これは、Xcode 5で大騒ぎせずに一貫して機能する唯一の答えです。"Editor-> Embed In"は正解のようですが、サブビューの移動先のビューが常にリストされているわけではありません。
デントン

10
  1. あるUIViewから別のUiView(子にすることができます)またはScrollViewに移動するすべてのコントロールを選択します

  2. 切り取り/コピー

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

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

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


これが機能する場合は、ここで最良の答えです(複数のコントロールを既存のビューにドラッグする場合)
Colin

Xcode 4.6.2の@meでは、セカンダリビューウィンドウをダブルクリックして開くことはできないため、この方法は機能しません。
コリン

Xcode 5では問題なく動作します。相対配置は同じままで、垂直配置だけがオフですが、グループ全体を一度に再配置するのは簡単です。
qix 2013年

悪い点は、autolayout制約が失われることです。 '( indiestack.com/2013/12/transplanting-constraints here "transplanting"制約の方法を見つけることができます
Joan Cardona

4

ストーリーボードを使用せずに、Stepanのソリューションと同様のことを行いました。ViewControllerのビューが開いているときにIBで:

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

2

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

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

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


2

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

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

A:
次の手順に従ってください。そうすれば、問題をできるだけ簡単に解決できます。

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

いいえ、まだ完了していません。場合によっては、UI制約に関連する問題がさらに少なくなることがあり、それに応じて解決する必要があります。


1

別のアプローチを検出しました。基本的には:移動=カット+貼り付け

この方法で:

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

このようにしないでください:

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

基本は、ストーリーボードの1つ(ルート)を除く各ビューに親ビューがあることです。次に、複数のサブビューをコピーまたは移動すると、フレームと拘束失われます

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

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

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

そして、元の親ビュー(P)から:

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

前:

表示1

ビュー2

P

移動したいSV

SV移動したくない

ビュー3

後:

表示1

ビュー2

P

SV移動したくない

ビュー3

P '

SVの移動したい

たとえば、親ビューとしてUIScrollViewがある場合、これは一般化されないことを強調しておきます。次に、そのコピーは、UIScrollViewになり、望ましくない場合があります。

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


0

この問題を解決するのに私が役立ったのは、

  1. ルートレベルのxibで目的の親ビュー(スクロールビューまたはuiview)を作成し、それに応じてサイズを変更します。
  2. この親ビューのサブビューにするすべてのビューをコピーし、手順1で作成した新しいビューに貼り付けます
  3. この時点で、これらのビューが複製されています。新しく追加されたビューは位置がずれていますが、同じ順序で互いに同じ距離にあり、xibでそれらを整列して、境界を同じビューの古いコピーと一致させます(これは、新しい親ビューが古いものと同じ境界があります)
  4. 新しく追加されたビューはいくつかの制約を失います、それらを修正するために古いビューを参照してください
  5. xibから古いビューを削除する
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.