Xcode - มีวิธีการลากส่วนประกอบจากมุมมองหนึ่งไปยังอีกมุมมองหนึ่งโดยไม่สูญเสียเฟรมหรือไม่?


92

สิ่งที่ฉันต้องการทำคือลากองค์ประกอบ / มุมมองจากซุปเปอร์วิวหนึ่งไปยังอีกมุมมองหนึ่งในตัวสร้างอินเทอร์เฟซของ Xcode โดยไม่ต้องรีเซ็ตเฟรม / ตำแหน่ง

พฤติกรรมเริ่มต้นของ Xcode เมื่อทำเช่นนี้ดูเหมือนว่าจะจัดมุมมองที่ถูกย้ายในแนวตั้งและแนวนอนในมุมมองใหม่แบบใหม่ในขณะที่รักษาขนาดไว้ นี่เป็นเรื่องที่น่าผิดหวังอย่างยิ่งเนื่องจากหมายความว่ามุมมองดังกล่าวต้องได้รับการปรับตำแหน่งใหม่ด้วยตนเองในมุมมองระดับสูงใหม่ แต่ฉันวางตำแหน่งอย่างถูกต้องก่อนที่จะย้ายดังนั้นฉันต้องการให้ Xcode จำคุณสมบัติทั้งหมดของเฟรมแทนที่จะเป็นเพียงความกว้าง / ความสูง เป็นไปได้หรือไม่


ในเวลาที่ผ่านมาหากคุณตัดและวางกรอบยังคงเหมือนเดิม ลองใช้งานดู
David H

ขอบคุณสำหรับคำแนะนำขออภัยดูเหมือนจะไม่ได้ผล ไม่งั้นฉันแค่ตัด / วางผิด สิ่งที่เกิดขึ้นคือ XCode จะแทนที่มุมมองที่ฉันพยายามจะวางด้วยมุมมองที่ฉันกำลังวาง (และถ้าฉันพยายามวางหลาย ๆ สิ่งพร้อมกันมันจะใช้รายการแรกในรายการเท่านั้น) การคัดลอกทำสิ่งเดียวกัน
aroth

ลองวางลงในคอลัมน์ด้านซ้าย - รายการ เลือกมุมมองขั้นสูงแล้ววาง มิฉะนั้นขออภัยจากข้อเสนอแนะ
David H

ลองทั้งสองวิธีแล้ว ไม่ทำงาน จบลงด้วยการต้องทำมันอย่างยากลำบาก
aroth

ดูเหมือนจะมีวิธีแก้ปัญหาในstackoverflow.com/questions/12034293/…แต่ก็ไม่ค่อยดีนัก
Eugene Osovetsky

คำตอบ:


225

วิธีแก้ปัญหาอื่น:

  1. เลือกรายการที่คุณต้องการในมุมมองย่อยของคุณจากนั้น
  2. (ในแถบเครื่องมือ) ตัวแก้ไข> ฝังใน> ประเภทมุมมองที่จะฝัง

12
ขอบคุณ. นี่ควรเป็นคำตอบที่ได้รับการยอมรับ เลือกมุมมองทั้งหมดที่คุณต้องการย้ายไปยังมุมมองขั้นสูงใหม่ -> ฝังในมุมมอง -> ย้ายมุมมองคอนเทนเนอร์ใหม่ไปยังมุมมองขั้นสูงที่ต้องการ -> ตัวแก้ไข - ไม่มีการฝัง โวลา! มุมมองทั้งหมดอยู่ในซูเปอร์วิวใหม่พร้อมเฟรมที่ถูกต้อง
Accatyyc

19
น่าเสียดายที่ข้อ จำกัด การจัดวางอัตโนมัติใด ๆ ไม่ได้รับการคัดลอกวิธีเดียวที่ฉันเห็นคือแก้ไข xml ของ xib ด้วยตนเอง: indiestack.com/2013/12/transplanting-constraints
James

1
สิ่งหนึ่งที่ยังแปลกคือเมื่อฉันฝังมุมมองย่อยลงในซูเปอร์วิวใหม่ซูเปอร์วิวจะมีพิกัดแปลก ๆ มันเริ่มต้นด้วย -20 x และ -20 y แล้วถ้าผมตั้งค่าเป็น 0,0 ทุกอย่างจะไม่อยู่ตรงกลาง
user3344977

1
@ เจมส์เคยทำแบบนั้น แต่ฉันพบว่าหากคุณใช้มุมมอง Command-X_Command-V ใน Xcode 6 ข้อ จำกัด ระหว่างมุมมองที่วางจะได้รับการเคารพ การปรับปรุงเล็กน้อย
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

10
  1. เลือกการควบคุมทั้งหมดที่คุณต้องการย้ายจาก UIView หนึ่งไปยัง UiView อื่น (ไม่ใช่ลูก) หรือ ScrollView

  2. ตัด / คัดลอก

  3. หลังจากลาก UIView / ScrollView ใหม่ไปยัง UIView ที่มีอยู่แล้วอย่าคลิกหนึ่งครั้งเพื่อเลือกแทนที่จะคลิกสองครั้งที่ UIView / ScrollView ใหม่และวางการควบคุมทั้งหมด

  4. ความแตกต่างของระยะทางจะยังคงเหมือนเดิมในการควบคุมทั้งหมด แต่คุณอาจต้องเปลี่ยนตำแหน่งการควบคุมอีกครั้ง ดังนั้นอย่าคลิกที่ใดก็ได้จนกว่าคุณจะเปลี่ยนตำแหน่งเหล่านั้นเพียงแค่เปลี่ยนตำแหน่งการควบคุมทั้งหมดโดยใช้ลูกศรนำทางเนื่องจากมีการเลือกทั้งหมดแล้วหรือคุณอาจเลือกอีกครั้งก็ได้

หมายเหตุ: ฉันใช้ XCode 4.2


นี่เป็นคำตอบที่ดีที่สุดหรือไม่ (สำหรับการลากหลายตัวควบคุมไปยังมุมมองที่มีอยู่)
Colin

@me บน Xcode 4.6.2 ไม่สามารถเปิดหน้าต่างมุมมองรองได้โดยดับเบิลคลิกที่มันดังนั้นวิธีนี้จึงไม่ได้ผล
Colin

ทำงานได้ดีใน Xcode 5 การวางตำแหน่งสัมพัทธ์ยังคงเหมือนเดิมเพียงแค่การวางตำแหน่งแนวตั้งปิดอยู่ แต่ก็ง่ายพอที่จะเปลี่ยนตำแหน่งทั้งกลุ่มพร้อมกัน
qix

สิ่งที่ไม่ดีก็คือคุณสูญเสียข้อ จำกัด การจัดระบบอัตโนมัติ: '( indiestack.com/2013/12/transplanting-constraintsที่นี่คุณจะพบวิธีการ จำกัด "การปลูกถ่าย"
Joan Cardona

4

ฉันทำบางอย่างที่คล้ายกับวิธีแก้ปัญหาของ Stepan โดยไม่ใช้สตอรี่บอร์ด ใน IB ขณะที่มุมมองของ ViewController เปิดอยู่:

  1. สร้างมุมมองอื่นนอกเหนือจากมุมมองหลักของ VC
  2. ย้ายมุมมองย่อยทั้งหมดไปยังมุมมองที่สองโดยการลากจากมุมมองหนึ่งไปยังอีกมุมมองหนึ่ง (การลากจากรายการทางด้านซ้ายจะรีเซ็ตตำแหน่ง) หากคุณไม่สามารถเลือกจาก IB โดยใช้เมาส์ของคุณให้เลือกทั้งหมดจากรายการทางด้านซ้ายจากนั้น เลือกมุมมองย่อยสุดท้ายจากแผง IB โดยใช้ปุ่ม "cmd"
  3. นำกลับไปที่มุมมองสุดท้ายของมุมมองหลักเริ่มต้น
  4. ลบมุมมองที่เพิ่มออกทั้งหมดตั้งค่า

2

นี่เป็นทางออกที่ดีที่สุดในการคัดลอกมุมมองย่อยไปยังมุมมองอื่นและรักษาตำแหน่งไว้:

  1. เลือกรายการที่คุณต้องการในมุมมองย่อยของคุณจากนั้น
  2. บรรณาธิการ -> ฝังใน -> ดู
  3. คัดลอกมุมมองนี้ (Cmd + C)
  4. เลิกทำ (Cmd + Z) (เนื่องจากคุณต้องการดูย่อย)
  5. ไปที่มุมมองที่คุณต้องการให้มุมมองย่อยและวาง (Cmd + V)
  6. เลือกมุมมองการฝังที่คุณคัดลอกวางและแก้ไข -> ไม่ได้ฝัง

ขั้นตอนที่ 6 จะลบมุมมองการฝังและคุณจะคัดลอกเฉพาะมุมมองย่อย


2

Xcode Interface Builder ยุ่งเมื่อมุมมองผู้ปกครองถูกลากและวางลงในมุมมองอื่น (UIView, ScrollView, StackView)

ถาม:
การฝังมุมมอง (ซึ่งมีมุมมองย่อยอื่น ๆ อยู่ภายใน) ลงใน ScrollView หรือในมุมมองระดับบนสุดอื่นไม่ตรงกับสิ่งที่ฉันเห็นจนถึงตอนนี้ สิ่งที่เกิดขึ้นหลังจากนั้นไม่นานคือมุมมองย่อยทั้งหมดอาจดูเหมือนว่าจะถูกวางผิดตำแหน่งเนื่องจากไม่พบเฟรมเดิม

ตอบ:
ทำตามขั้นตอนต่อไปนี้และคุณจะสามารถแก้ไขได้ง่ายขึ้นที่สุด:

  1. เลือกรายการที่คุณต้องการในมุมมองย่อยของคุณจากนั้น
  2. ไปที่แถบเมนูตัวแก้ไข -> ฝังใน -> ดู
  3. คัดลอกมุมมองใหม่นี้ (Cmd + C) พร้อมกับมุมมองย่อย (สำหรับฉันตอนนี้ข้อ จำกัด ทั้งหมดยังคงอยู่จนถึงจุดนี้)
  4. ไปที่มุมมอง (ไม่ว่าจะเป็น ScrollView หรืออาจเป็น StackView) ที่คุณต้องการให้มุมมองย่อยอยู่ในและวาง (Cmd + V) มุมมองที่คัดลอก
  5. เลือกมุมมองการฝังที่วางไว้ (ซึ่งคุณสร้างขึ้นใหม่ก่อนหน้านี้) และไปที่แถบเมนูของ Xcode, Editor -> Unembed

ไม่ยังไม่เสร็จ! บางครั้งคุณอาจพบว่ามีปัญหาที่เกี่ยวข้องกับ UI Constraint อีกเล็กน้อยคุณจะต้องแก้ไขตามนั้น


1

ฉันตรวจพบแนวทางอื่น โดยพื้นฐานแล้ว: Move = Cut + Paste

วิธีนี้คุณทำ:

  • ทำให้มุมมองย่อยทั้งหมดของคุณเป็นลูกของมุมมองผู้ปกครองใหม่ (P ')
  • เก็บข้อ จำกัด (เกือบ) ทั้งหมดของคุณไว้ใน Storyboard ที่ใช้เค้าโครงอัตโนมัติ
  • รักษาตำแหน่งสัมพัทธ์ของมุมมองย่อยของคุณ (เฟรม) ต่อกัน

วิธีนี้คุณจะไม่:

  • แก้ไขไฟล์ Storyboard ในโปรแกรมแก้ไขข้อความ

ฐานเป็นสิ่งที่มุมมองของแต่ละคนยกเว้นหนึ่ง (root) ในสตอรี่บอร์ดมีมุมมองที่แม่ของมัน ถัดไปเมื่อคุณคัดลอก / ย้าย subviews หลายท่านสูญเสียเฟรมและข้อ จำกัด

คำตอบนั้นค่อนข้างง่าย คุณทำสำเนาของมุมมองย่อย (SV) ของคุณโดยคัดลอกมุมมองระดับบนสุด (P) ไปยังมุมมองหลักใหม่ (P ') ด้วยวิธีนี้คุณอาจต้องสร้างเฉพาะข้อ จำกัด จากมุมมองใหม่ของพาเรนต์ (P ') ไปยังมุมมองพาเรนต์ใหม่ แต่ไม่ใช่สำหรับทุกมุมมองย่อยที่คุณต้องการย้าย

หลังจากที่คุณทำสำเนามุมมองหลัก (P) เป็นมุมมองใหม่ (P ') จากมุมมองใหม่ (P') คุณ:

  • นำเด็กทั้งหมดออกยกเว้นเด็กที่คุณต้องการย้าย
  • สร้างข้อ จำกัด พาเรนต์ใหม่ (P ')
  • สร้างช่องทางการสร้างส่วนต่อประสานที่เป็นไปได้ใหม่เป็น (SVs ')

และจากมุมมองของผู้ปกครองดั้งเดิม (P) คุณ:

  • นำเด็กทั้งหมดที่คุณต้องการย้ายออก

ก่อน:

มุมมอง 1

ดู 2

SVs ที่คุณต้องการย้าย

SVs- คุณไม่ต้องการย้าย

มุมมอง 3

หลังจาก:

มุมมอง 1

ดู 2

SVs- คุณไม่ต้องการย้าย

มุมมอง 3

P '

SV ที่คุณต้องการย้าย

ฉันควรเน้นว่าสิ่งนี้ไม่สามารถสรุปได้ดีหากคุณมีเช่น UIScrollView เป็นมุมมองหลัก จากนั้นสำเนาของมันจะเป็น UIScrollView อีกครั้งสิ่งที่อาจไม่เป็นที่ต้องการ

อีกประการหนึ่งคือเมื่อคุณลบมุมมองย่อย (SV) บางส่วนในมุมมองหลักดั้งเดิม (P) คุณอาจต้องสร้างข้อ จำกัด บางอย่างขึ้นมาใหม่หากมุมมองย่อยอื่น ๆ (ที่ไม่สามารถเคลื่อนย้ายได้) อ้างถึง แต่คุณควรทำอย่างนั้นต่อไป


0

สิ่งที่ช่วยฉันแก้ปัญหานี้คือ -

  1. สร้างมุมมองพาเรนต์ที่ต้องการ (มุมมองแบบเลื่อนหรือ uiview) ใน xib ที่ระดับรูทและปรับขนาดตามนั้น
  2. คัดลอกมุมมองทั้งหมดที่คุณต้องการให้เป็นมุมมองย่อยของมุมมองหลักนี้และวางลงในมุมมองใหม่ที่คุณสร้างในขั้นตอนที่ 1
  3. ณ จุดนี้คุณจะทำซ้ำมุมมองเหล่านี้ มุมมองที่เพิ่มเข้ามาใหม่จะเป็นมุมมองที่ไม่ตรงแนว แต่ยังคงอยู่ในลำดับเดียวกันและในระยะเดียวกันเมื่อเทียบกันจัดแนวใน xib เพื่อให้ตรงกับขอบเขตกับสำเนาเก่าของมุมมองเดียวกัน (ซึ่งถือว่ามุมมองหลักใหม่ มีขอบเขตเดียวกันกับเก่า)
  4. มุมมองที่เพิ่มเข้ามาใหม่จะสูญเสียข้อ จำกัด บางประการให้อ้างถึงมุมมองเก่าเพื่อแก้ไข
  5. ลบมุมมองเก่าออกจาก xib
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.