Xcode-프레임을 잃지 않고 한 뷰에서 다른 뷰로 컴포넌트를 드래그하는 방법이 있습니까?


91

내가하고 싶은 것은 프레임 / 위치를 재설정하지 않고 Xcode의 인터페이스 빌더에서 한 수퍼 뷰에서 다른 수퍼 뷰로 컴포넌트 / 뷰를 드래그하는 것입니다.

이 작업을 수행 할 때 Xcode의 기본 동작은 크기를 유지하면서 새로운 수퍼 뷰에서 수직 및 수평으로 이동되는 뷰를 중앙에 배치하는 것 같습니다. 새로운 수퍼 뷰에서 뷰의 위치를 ​​수동으로 변경해야하기 때문에 매우 실망 스럽습니다. 하지만 이동하기 전에 올바르게 배치 했으므로 Xcode가 너비 / 높이 대신 프레임의 모든 속성을 기억하기를 원합니다. 이것이 가능한가?


과거의 시간에 잘라서 붙여 넣으면 프레임이 그대로 유지되었습니다. 그것을 시도하고보십시오.
David H

제안 해 주셔서 감사합니다. 안타깝게도 작동하지 않는 것 같습니다. 아니면 그냥 잘못 자르거나 붙여 넣는 것입니다. XCode가 붙여 넣으려는 뷰를 붙여 넣는 뷰로 대체합니다 (그리고 한 번에 여러 항목을 붙여 넣으려고하면 목록의 첫 번째 항목 만 사용함). 복사는 같은 일을합니다.
aroth

왼쪽 열인 목록에 붙여 넣으십시오. 슈퍼 뷰를 선택한 다음 붙여 넣습니다. 그렇지 않으면 미안합니다.
David H

두 가지 방법을 모두 시도했습니다. 작동하지 않습니다. 힘든 방법으로해야했습니다.
aroth

stackoverflow.com/questions/12034293/에 해결 방법이있는 것 같지만 별로 좋지 않습니다
Eugene Osovetsky

답변:


223

또 다른 해결책 :

  1. 하위보기에서 원하는 항목을 선택한 다음
  2. (도구 모음에서) 편집기> 포함> 포함 할보기 유형.

12
감사. 이것은 받아 들여진 대답이어야합니다. 새 수퍼 뷰로 이동하려는 모든 뷰를 선택-> 뷰에 포함-> 새 컨테이너 뷰를 원하는 수퍼 뷰로 이동-> 편집기-포함 해제. 짜잔! 모든 뷰는 올바른 프레임이있는 새 슈퍼 뷰에 있습니다.
Accatyyc

18
너무 나쁜 자동 레이아웃 제약은 복사되지 않습니다. 내가 본 유일한 방법은 xib의 xml을 수동으로 편집하는 것입니다. indiestack.com/2013/12/transplanting-constraints
James

1
여전히 이상한 점은 하위 뷰를 새 슈퍼 뷰에 포함 할 때 슈퍼 뷰에 이상한 좌표가 있다는 것입니다. -20 x 및 -20 y로 시작하고 0,0으로 설정하면 모든 것이 중심에서 벗어납니다.
user3344977

1
@James 나는 그것을 사용했다. 그러나 Xcode 6에서 Command-X_Command-V 뷰를 사용하면 붙여 넣은 뷰 사이의 제약 조건이 존중된다는 것을 알았습니다. 작은 개선.
Steven Kramer

4
@StevenKramer Command-X 및 Command-V로 시도했지만 작동하지 않았습니다. 이 작업을 수행하기위한 추가 단계가 있습니까? 나는 관심이 있습니다
arh

28

여러분에게 도움이 될만한 것을 찾았습니다!

작업은 "하위보기"를 "상위보기"로 다시 그룹화하여 계층 적으로 상위보기의 하위가되고 작업 전과 같이 디스플레이에 물리적 위치를 유지하는 것입니다.

먼저 부모보기를 조정하여 자식보기 영역을 물리적으로 덮습니다. 둘째, 모든 어린이가보기 목록에서 아래에 있는지 확인하십시오.

이제 마우스로 모든 자식을 선택하고 예를 들어 한 픽셀 위로 이동하고 한 픽셀 아래로 이동합니다 (IB에 약간의 변화가 있다고 말하면). 그 석방 후 아이들은 마술처럼 부모의 자식이되어 그들의 위치를 ​​계속 보여줄 것입니다.

OSX 10.8.2 및 Xcode 4.6에서 작동합니다.

행운을 빕니다!


굉장합니다 ... 이것은 콘센트와 프레임도 깨지지 않습니다. 뷰에 포함하면 프레임이 깨집니다. 잘라 내기 붙여 넣기 방법은 콘센트와 프레임을 끊습니다.
jeet.chanchawat

22

나는 물건을 재배치하는 데 드는 많은 시간을 절약 할 수 있었고 이렇게했습니다.

  1. 인터페이스 빌더의 상위보기를 하위보기와 동일한 수준에 추가합니다.
  2. 텍스트 편집기에서 스토리 보드를 열고 상위보기의 하위보기 태그 안에있는 하위보기를 복사합니다. 저장하면 XCode가 업데이트됩니다.

하지만별로 우아하지는 않지만 XCode가 Shift 등으로 지원하지 않는 이유를 알 수 없습니다.


3
이것은 Xcode 5에서 소란없이 일관되게 작동하는 유일한 답변입니다. "Editor-> Embed In"이 정답 인 것 같지만 하위보기를 이동하려는보기가 항상 나열되는 것은 아닙니다.
Denton 2013

10
  1. 한 UIView에서 다른 UiView (하위가 아님) 또는 ScrollView로 이동하려는 모든 컨트롤을 선택합니다.

  2. 잘라 내기 / 복사

  3. 이제 새 UIView / ScrollView를 기존 UIView로 드래그 한 후 한 번 클릭하여 선택하지 말고 대신 새 UIView / ScrollView를 두 번 클릭하고 모든 컨트롤을 붙여 넣습니다.

  4. 거리 차이는 모든 컨트롤간에 동일하게 유지되지만 컨트롤 위치를 다시 조정해야 할 수도 있습니다. 따라서 위치를 변경할 때까지 아무 곳이나 클릭하지 말고 모든 컨트롤이 이미 선택되어 있으므로 탐색 화살표로 모든 컨트롤의 위치를 ​​변경하거나 다시 선택해야 할 수 있습니다.

참고 : 나는 XCode 4.2에서


이 그것이 여기에 가장 좋은 대답을의 작품 이봐 (기존 뷰에 여러 컨트롤을 드래그 용)
콜린

@me on Xcode 4.6.2에서는 두 번 클릭하여 보조보기 창을 열 수 없으므로이 방법이 작동하지 않습니다.
Colin

Xcode 5에서 잘 작동합니다. 상대 위치는 동일하게 유지되고 수직 위치는 꺼져 있지만 전체 그룹의 위치를 ​​한 번에 쉽게 조정할 수 있습니다.
qix

나쁜 것은 당신이 당신의 자동 레이아웃 제약을 잃을 것입니다 : '( indiestack.com/2013/12/transplanting-constraints이 여기에 당신이 "이식"제약의 길을 찾을 수 있습니다
조안 카르 도나

4

스토리 보드를 사용하지 않고 Stepan의 솔루션과 유사한 작업을 수행했습니다. ViewController의 뷰가 열려있는 동안 IB에서 :

  1. VC의 기본보기 외에 다른보기 만들기
  2. 모든 하위보기를 한보기에서 다른보기로 드래그하여 두 번째보기로 이동합니다 (왼쪽 목록에서 드래그하면 위치가 재설정 됨). IB에서 마우스를 사용하여 선택할 수없는 경우 왼쪽 목록에서 모두 선택합니다. "cmd"버튼을 사용하여 IB 패널에서 하나의 최종 하위보기를 선택합니다.
  3. 초기 기본보기의 최종보기로 되돌립니다.
  4. 추가 된보기를 모두 제거합니다.

2

이것은 하위 뷰를 다른 뷰로 복사하고 위치를 유지하는 가장 좋은 솔루션입니다.

  1. 하위보기에서 원하는 항목을 선택한 다음
  2. 편집기-> 삽입 위치->보기
  3. 이보기 복사 (Cmd + C)
  4. 실행 취소 (Cmd + Z) (하위보기를 원했기 때문에)
  5. 하위보기를 원하는보기로 이동하여 붙여 넣기 (Cmd + V)
  6. 복사하여 붙여 넣은 Embedding View를 선택하고 Editor-> Unembed

6 단계는 임베딩 뷰를 제거하고 하위 뷰만 복사합니다.


2

Xcode Interface Builder는 부모 뷰를 다른 뷰 (UIView, ScrollView, StackView)로 끌어다 놓을 때 엉망이됩니다.

Q :
뷰 (다른 많은 하위 뷰가 포함되어 있음)를 ScrollView 또는 다른 최상위 뷰에 포함하는 것은 지금까지 본 것과 간단하지 않습니다. 곧 발생하는 일은 원래 프레임을 찾을 수 없기 때문에 모든 하위 뷰가 잘못 배치 된 것처럼 보일 수 있다는 것입니다.

A :
다음 단계를 따르시면 가능한 한 쉽게 해결할 수 있습니다.

  1. 하위보기에서 원하는 항목을 선택한 다음
  2. 메뉴 바, 편집기-> 포함->보기로 이동합니다.
  3. 이 새 뷰 (Cmd + C)를 하위 뷰와 함께 복사합니다 (현재 모든 제약 조건은 지금까지 유지되었습니다).
  4. 하위보기를 포함 할보기 (ScrollView 또는 StackView 일 수 있음)로 이동하고 복사 된보기를 붙여 넣습니다 (Cmd + V).
  5. 붙여 넣은 Embedding View (이전에 새로 생성 한)를 선택하고 Xcode, Editor-> Unembed 메뉴 바로 이동합니다.

아니요, 아직 끝나지 않았습니다! 때로는 UI 제약과 관련된 문제가 거의 없다는 것을 경험할 수 있으며 그에 따라 문제를 해결해야합니다.


1

다른 접근 방식을 발견했습니다. 기본적으로 : Move = Cut + Paste

이렇게하면 :

  • 모든 하위보기를 새 상위보기 (P ')의 하위로 가져옵니다.
  • Auto-Layout 기반 Storyboard에 (거의) 모든 제약 조건 유지
  • 서브 뷰의 상대적 위치 (프레임)를 서로 유지

이렇게하면 다음을 수행 할 수 없습니다.

  • 텍스트 편집기에서 스토리 보드 파일 편집

기본적으로 Storyboard에서 하나 (루트)를 제외한 각 뷰 에는 상위 뷰가 있습니다 . 다음으로 여러 하위보기를 복사 / 이동하면 프레임과 제약 조건손실됩니다 .

대답은 아주 간단합니다. 상위 뷰 (P)를 새 상위 뷰 (P ')에 복사하여 하위 뷰 (SV)의 복사본을 만듭니다. 이렇게하면 이동하려는 모든 하위보기가 아닌 해당 상위 새보기 (P ')에서 새 상위보기로 제약 조건 만 다시 만들어야 할 수 있습니다.

상위 뷰 (P)를 새 뷰 (P ')로 복사 한 후 새 뷰 (P')에서 다음을 수행합니다.

  • 옮기고 싶은 아이들을 제외한 모든 아이들을 제거하십시오
  • 새 부모 (P ') 제약을 다시 생성합니다.
  • 가능한 Interface Builder 아웃렛을 (SVs ')에 다시 생성

원래 부모보기 (P)에서 다음을 수행합니다.

  • 이동하려는 모든 아이들을 제거하십시오

전에:

보기 1

보기 2

이동하고 싶은 SV

이동하고 싶지 않은 SV

보기 3

후:

보기 1

보기 2

이동하고 싶지 않은 SV

보기 3

피'

이동하고 싶은 SV

예를 들어 UIScrollView를 부모 뷰로 사용하는 경우 이것이 잘 일반화되지 않는다는 점을 강조해야합니다. 그런 다음 복사본은 바람직하지 않은 UIScrollView가 될 것입니다.

또 다른 한 가지는 원래 상위 뷰 (P)에서 일부 하위 뷰 (SV)를 제거 할 때 다른 (이동 불가능한 하위 뷰)가 참조하는 경우 일부 제약 조건을 다시 만들어야 할 수 있다는 것입니다. 하지만 어쨌든 그렇게해야합니다.


0

이 문제를 해결하는 데 도움이 된 것은

  1. 루트 수준의 xib에서 원하는 부모보기 (스크롤보기 또는 uiview)를 만들고 그에 따라 크기를 조정합니다.
  2. 이 상위보기의 하위보기가 될 모든보기를 복사하여 1 단계에서 작성한 새보기에 붙여 넣으십시오.
  3. 이 시점에서 이러한 뷰를 복제하게됩니다. 새로 추가 된 뷰는 잘못 정렬되었지만 여전히 동일한 순서이고 서로에 대해 동일한 거리에 있으며 xib에서 정렬하여 동일한 뷰의 이전 복사본과 경계를 일치시킵니다 (이는 새 상위 뷰가 이전 것과 동일한 경계가 있음)
  4. 새로 추가 된 뷰는 제약 조건 중 일부를 잃게됩니다. 이전 뷰를 참조하여 수정하십시오.
  5. xib에서 이전보기 삭제
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.