สมมติว่าฉันได้เพิ่มมุมมองเพิ่มเติมใน UIStackView ซึ่งสามารถแสดงได้ฉันจะUIStackView
เลื่อนได้อย่างไร
สมมติว่าฉันได้เพิ่มมุมมองเพิ่มเติมใน UIStackView ซึ่งสามารถแสดงได้ฉันจะUIStackView
เลื่อนได้อย่างไร
คำตอบ:
ในกรณีที่ทุกคนกำลังมองหาวิธีการแก้ปัญหาโดยไม่ต้องใช้รหัสฉันได้สร้างตัวอย่างเพื่อทำสิ่งนี้อย่างสมบูรณ์ในกระดานเรื่องราวโดยใช้เค้าโครงอัตโนมัติ
โดยทั่วไปเพื่อสร้างตัวอย่าง (สำหรับการเลื่อนแนวตั้ง):
UIScrollView
และตั้งข้อ จำกัดUIStackView
ไปที่UIScrollView
Leading
, Trailing
,Top
และBottom
ควรจะเท่ากับคนจากUIScrollView
Width
ข้อ จำกัด ที่เท่าเทียมกันระหว่างUIStackView
และUIScrollView
และUIStackView
UIViews
ไปUIStackView
แลกเปลี่ยนWidth
สำหรับHeight
ในขั้นตอนที่ 4 และชุดAxis
= Horizontal
ในขั้นตอนที่ 5 จะได้รับ UIStackView แนวนอน
แอปเปิ้ลออโต้คู่มือการจัดรวมทั้งส่วนในการทํางานกับเลื่อนชม ตัวอย่างบางส่วนที่เกี่ยวข้อง:
- ปักหมุดมุมมองด้านบน, ล่าง, นำหน้าและต่อท้ายไปที่ขอบที่สอดคล้องกันของมุมมองเลื่อน ตอนนี้มุมมองเนื้อหาจะกำหนดพื้นที่เนื้อหาของมุมมองเลื่อน
- (ไม่บังคับ) หากต้องการปิดใช้งานการเลื่อนแนวนอนให้ตั้งค่าความกว้างของมุมมองเนื้อหาเท่ากับความกว้างของมุมมองเลื่อน ขณะนี้มุมมองเนื้อหาเติมมุมมองเลื่อนในแนวนอน
- (ไม่บังคับ) หากต้องการปิดใช้งานการเลื่อนแนวตั้งให้ตั้งค่าความสูงของมุมมองเนื้อหาเท่ากับความสูงของมุมมองเลื่อน ขณะนี้มุมมองเนื้อหาเติมมุมมองเลื่อนในแนวนอน
นอกจากนี้:
โครงร่างของคุณต้องกำหนดขนาดของมุมมองเนื้อหาทั้งหมด (ยกเว้นที่กำหนดไว้ในขั้นตอนที่ 5 และ 6) …เมื่อมุมมองเนื้อหาสูงกว่ามุมมองเลื่อนมุมมองเลื่อนจะเปิดใช้งานการเลื่อนแนวตั้ง เมื่อมุมมองเนื้อหากว้างกว่ามุมมองเลื่อนมุมมองเลื่อนจะเปิดใช้งานการเลื่อนแนวนอน
ในการสรุปมุมมองเนื้อหาของมุมมองเลื่อน (ในกรณีนี้มุมมองสแต็ก) ต้องถูกตรึงที่ขอบและมีความกว้างและ / หรือความสูง จำกัด ซึ่งหมายความว่าเนื้อหาของมุมมองสแต็กต้องถูก จำกัด (โดยทางตรงหรือทางอ้อม) ในทิศทางที่ต้องการเลื่อนซึ่งอาจหมายถึงการเพิ่มข้อจำกัดความสูงให้กับแต่ละมุมมองภายในมุมมองสแต็กเลื่อนแนวตั้ง ต่อไปนี้เป็นตัวอย่างของวิธีการอนุญาตให้เลื่อนแนวตั้งของมุมมองเลื่อนที่มีมุมมองสแต็ก:
// Pin the edges of the stack view to the edges of the scroll view that contains it
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
// Set the width of the stack view to the width of the scroll view for vertical scrolling
stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
Need constraints for: Y position or height.
ข้อผิดพลาดนี้จะหายไปถ้าคุณตั้งค่าทั้งความกว้างและความสูงสำหรับข้อ จำกัด ของมุมมองสแต็ก รหัสนี้ยังใช้ได้กับคุณหรือไม่?
ข้อ จำกัด ในคำตอบที่ได้รับการโหวตสูงสุดที่นี่ใช้ได้สำหรับฉันและฉันวางภาพของข้อ จำกัด ด้านล่างตามที่สร้างไว้ในกระดานเรื่องราวของฉัน
ฉันตีสองประเด็นแม้ว่าคนอื่นควรระวัง:
หลังจากเพิ่มข้อ จำกัด Need constraints for: X position or width
ที่คล้ายกับผู้ที่อยู่ในในคำตอบที่ได้รับการยอมรับผมได้รับข้อผิดพลาด สิ่งนี้ได้รับการแก้ไขโดยการเพิ่ม UILabel เป็นมุมมองย่อยของมุมมองสแต็ก
ฉันกำลังเพิ่มการสัมภาษณ์ย่อยโดยทางโปรแกรมดังนั้นในตอนแรกฉันไม่มีการแสดงความเห็นย่อยบนกระดานเรื่องราว หากต้องการกำจัดข้อผิดพลาดของการชำระอัตโนมัติให้เพิ่มมุมมองย่อยลงในกระดานเรื่องราวแล้วลบออกเมื่อโหลดก่อนที่จะเพิ่มการชมย่อยและข้อ จำกัด ที่แท้จริงของคุณ
ตอนแรกฉันพยายามเพิ่มUIButtons
ใน UIStackView ปุ่มและมุมมองที่จะโหลด แต่มุมมองเลื่อนจะไม่เลื่อน สิ่งนี้ได้รับการแก้ไขโดยการเพิ่มUILabels
ไปที่มุมมองสแต็กแทนที่จะเป็นปุ่ม การใช้ข้อ จำกัด เดียวกันลำดับชั้นมุมมองนี้กับ UILabels เลื่อน แต่ UIButtons ไม่ได้
ฉันสับสนโดยปัญหานี้เป็น UIButtons ไม่ดูเหมือนจะมี IntrinsicContentSize (ใช้โดยกอง View) หากใครรู้ว่าทำไมปุ่มไม่ทำงานฉันชอบที่จะรู้ว่าทำไม
นี่คือลำดับชั้นการดูและข้อ จำกัด ของฉันสำหรับการอ้างอิง:
ในฐานะที่เป็น Eik กล่าวUIStackView
และUIScrollView
เล่นด้วยกันอย่างเห็นที่นี่
กุญแจสำคัญคือการUIStackView
จัดการความสูง / ความกว้างของตัวแปรสำหรับเนื้อหาที่แตกต่างและUIScrollView
จากนั้นทำงานได้ดีในการเลื่อน / กำยำเนื้อหานั้น:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSize(width: stackView.frame.width, height: stackView.frame.height)
}
ฉันกำลังมองหาที่จะทำสิ่งเดียวกันและสะดุดกับโพสต์ที่ยอดเยี่ยมนี้หากคุณต้องการทำสิ่งนี้โดยใช้โปรแกรมสมอ API นี่เป็นวิธีที่จะไป
ในการสรุปฝังของUIStackView
คุณUIScrollView
และตั้งค่าข้อ จำกัด ของสมอUIStackView
ให้ตรงกับUIScrollView
:
stackView.leadingAnchor.constraintEqualToAnchor(scrollView.leadingAnchor).active = true
stackView.trailingAnchor.constraintEqualToAnchor(scrollView.trailingAnchor).active = true
stackView.bottomAnchor.constraintEqualToAnchor(scrollView.bottomAnchor).active = true
stackView.topAnchor.constraintEqualToAnchor(scrollView.topAnchor).active = true
stackView.widthAnchor.constraintEqualToAnchor(scrollView.widthAnchor).active = true
มีฉากเต็มหน้าจอว่างเปล่า
เพิ่มมุมมองเลื่อน ควบคุมการลากจากมุมมองเลื่อนไปที่มุมมองพื้นฐานเพิ่มซ้ายขวาบนล่างทั้งหมดเป็นศูนย์
เพิ่มมุมมองสแต็กในมุมมองเลื่อน ควบคุมการลากจากมุมมองสแต็กไปยังมุมมองเลื่อนเพิ่มซ้ายขวาบนล่างทั้งหมดเป็นศูนย์
วางสองหรือสามป้ายภายในมุมมองสแต็ก
เพื่อความชัดเจนให้ทำให้สีพื้นหลังของฉลากเป็นสีแดง ตั้งความสูงของฉลากเป็น 100
ตอนนี้ตั้งค่าความกว้างของแต่ละ UILabel:
น่าแปลกที่การควบคุมการลากจากUILabel
ไปยังมุมมองเลื่อนไม่ไปที่มุมมองสแต็คและเลือกความกว้างเท่ากัน
ทำซ้ำ:
มันง่ายมาก นั่นเป็นความลับ
เคล็ดลับความลับ - ข้อผิดพลาดของ Apple:
มันจะไม่ทำงานกับไอเท็มเดียวเท่านั้น! เพิ่มป้ายกำกับเล็กน้อยเพื่อให้การสาธิตทำงานได้
คุณทำเสร็จแล้ว
เคล็ดลับ: คุณต้องเพิ่มความสูงให้กับรายการใหม่ทุก ทุกรายการในมุมมองสแต็กการเลื่อนใด ๆ ต้องมีขนาดที่แท้จริง (เช่นฉลาก) หรือเพิ่มข้อจำกัดความสูงอย่างชัดเจน
วิธีการทางเลือก:
ในด้านบน: น่าประหลาดใจที่ตั้งค่าความกว้างของ UILabels เป็นความกว้างของมุมมองเลื่อน (ไม่ใช่มุมมองสแต็ก)
อีกวิธีหนึ่งคือ ...
ดังนั้นคุณมีสองทางเลือก:
หรือ
เพื่อให้ชัดเจนทำหนึ่งในวิธีเหล่านั้นอย่าทำทั้งสองอย่าง
สำหรับการเลื่อนแนวนอน ก่อนอื่นสร้างUIStackView
และ a UIScrollView
และเพิ่มลงในมุมมองของคุณด้วยวิธีต่อไปนี้:
let scrollView = UIScrollView()
let stackView = UIStackView()
scrollView.addSubview(stackView)
view.addSubview(scrollView)
ความทรงจำที่จะตั้งtranslatesAutoresizingMaskIntoConstraints
ไปfalse
บนUIStackView
และUIScrollView
:
stackView.translatesAutoresizingMaskIntoConstraints = false
scrollView.translatesAutoresizingMaskIntoConstraints = false
ในการทำให้ทุกอย่างทำงานได้อย่างUIStackView
ถูกต้องจะต้องมีค่าเท่ากับUIScrollView
จุดยึด:
stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
แต่ความกว้างของสมอUIStackView
ต้องเท่ากับหรือมากกว่าความกว้างของUIScrollView
สมอ:
stackView.widthAnchor.constraint(greaterThanOrEqualTo: scrollView.widthAnchor).isActive = true
ตอนนี้ยึดของคุณUIScrollView
ตัวอย่างเช่น:
scrollView.heightAnchor.constraint(equalToConstant: 80).isActive = true
scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
scrollView.bottomAnchor.constraint(equalTo:view.safeAreaLayoutGuide.bottomAnchor).isActive = true
scrollView.leadingAnchor.constraint(equalTo:view.leadingAnchor).isActive = true
scrollView.trailingAnchor.constraint(equalTo:view.trailingAnchor).isActive = true
ถัดไปฉันขอแนะนำให้ลองตั้งค่าต่อไปนี้สำหรับการUIStackView
จัดตำแหน่งและการกระจาย:
topicStackView.axis = .horizontal
topicStackView.distribution = .equalCentering
topicStackView.alignment = .center
topicStackView.spacing = 10
ในที่สุดคุณจะต้องใช้addArrangedSubview:
วิธีนี้เพื่อเพิ่มการดูย่อยลงใน UIStackView ของคุณ
คุณสมบัติเพิ่มเติมอย่างหนึ่งที่คุณอาจพบว่ามีประโยชน์ก็คือเพราะสิ่งที่UIStackView
อยู่ภายในUIScrollView
คุณสามารถเข้าถึงส่วนแทรกข้อความเพื่อทำให้สิ่งต่าง ๆ ดูน่ารักขึ้น
let inset:CGFloat = 20
scrollView.contentInset.left = inset
scrollView.contentInset.right = inset
// remember if you're using insets then reduce the width of your stack view to match
stackView.widthAnchor.constraint(greaterThanOrEqualTo: topicScrollView.widthAnchor, constant: -inset*2).isActive = true
เพียงเพิ่มลงในviewdidload
:
let insets = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
scrollVIew.contentInset = insets
scrollVIew.scrollIndicatorInsets = insets
คุณสามารถลองใช้ScrollableStackView : https://github.com/gurhub/ScrollableStackView
มันเป็นห้องสมุดที่รองรับ Objective-C และ Swift มันสามารถใช้ได้ผ่านCocoaPods
โค้ดตัวอย่าง (Swift)
import ScrollableStackView
var scrollable = ScrollableStackView(frame: view.frame)
view.addSubview(scrollable)
// add your views with
let rectangle = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 55))
rectangle.backgroundColor = UIColor.blue
scrollable.stackView.addArrangedSubview(rectangle)
// ...
โค้ดตัวอย่าง (Objective-C)
@import ScrollableStackView
ScrollableStackView *scrollable = [[ScrollableStackView alloc] initWithFrame:self.view.frame];
scrollable.stackView.distribution = UIStackViewDistributionFillProportionally;
scrollable.stackView.alignment = UIStackViewAlignmentCenter;
scrollable.stackView.axis = UILayoutConstraintAxisVertical;
[self.view addSubview:scrollable];
UIView *rectangle = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 55)];
[rectangle setBackgroundColor:[UIColor blueColor]];
// add your views with
[scrollable.stackView addArrangedSubview:rectangle];
// ...
หากคุณมีข้อ จำกัด ในการจัดมุมมองสแต็กตรงกลางภายในมุมมองเลื่อนเพียงแค่ลบออก
ตัวอย่างสำหรับ stackview / scrollview แนวตั้ง (ใช้EasyPeasy
สำหรับ autolayout):
let scrollView = UIScrollView()
self.view.addSubview(scrollView)
scrollView <- [
Edges(),
Width().like(self.view)
]
let stackView = UIStackView(arrangedSubviews: yourSubviews)
stackView.axis = .vertical
stackView.distribution = .fill
stackView.spacing = 10
scrollView.addSubview(stackView)
stackView <- [
Edges(),
Width().like(self.view)
]
เพียงตรวจสอบให้แน่ใจว่าได้กำหนดความสูงของแต่ละมุมมองย่อยแล้ว!
อันดับแรกและสำคัญที่สุดในการออกแบบมุมมองของคุณโดยเฉพาะอย่างยิ่งในสิ่งที่ต้องการร่างหรือได้รับความคิดของสิ่งที่คุณต้องการเป็นเนื้อหาที่เลื่อนได้
หลังจากนี้ทำให้ตัวควบคุมมุมมองเป็นอิสระ (เลือกจากตัวตรวจสอบคุณสมบัติ) และตั้งค่าความสูงและความกว้างตามขนาดเนื้อหาที่แท้จริงของมุมมองของคุณ (เลือกจากตัวตรวจสอบขนาด)
หลังจากนี้ในตัวควบคุมมุมมองใส่มุมมองเลื่อนและนี่คือตรรกะซึ่งฉันได้พบว่าทำงานเกือบทุกครั้งใน iOS (มันอาจต้องผ่านเอกสารของมุมมองที่ชั้นที่หนึ่งสามารถรับผ่านคำสั่ง + คลิกที่ ชั้นเรียนนั้นหรือผ่าน googling)
หากคุณกำลังทำงานกับสองมุมมองหรือมากกว่านั้นก่อนอื่นให้เริ่มด้วยมุมมองที่ได้รับการแนะนำก่อนหน้านี้หรือเป็นแบบดั้งเดิมและจากนั้นไปที่มุมมองที่ได้รับการแนะนำในภายหลังหรือทันสมัยกว่า ดังนั้นที่นี่เนื่องจากมีการแนะนำมุมมองเลื่อนก่อนเริ่มด้วยมุมมองเลื่อนก่อนจากนั้นไปที่มุมมองสแต็ก ที่นี่ทำให้ข้อ จำกัด การเลื่อนดูเป็นศูนย์ในทุกทิศทางเผชิญหน้ากับมุมมองที่ยอดเยี่ยม ใส่มุมมองทั้งหมดของคุณไว้ในมุมมองเลื่อนนี้แล้วใส่ในมุมมองสแต็ก
ในขณะที่ทำงานกับมุมมองสแต็ก
ก่อนอื่นให้เริ่มจากบริเวณด้านล่าง (ขึ้นด้านล่าง) เช่นหากคุณมีป้ายชื่อฟิลด์ข้อความและรูปภาพในมุมมองของคุณให้กำหนดมุมมองเหล่านี้ก่อน
หลังจากนั้นปรับแต่งคุณสมบัติของมุมมองสแต็ก หากมุมมองที่ต้องการยังไม่บรรลุผลให้ใช้มุมมองสแต็กอื่น
หลังจากสร้างมุมมองของคุณให้วางข้อ จำกัด ระหว่างมุมมองแม่สแต็กและมุมมองเลื่อนขณะที่มุมมองลูกซ้อน จำกัด กับมุมมองแม่สแต็ก หวังว่าในเวลานี้มันจะทำงานได้ดีหรือคุณอาจได้รับคำเตือนจาก Xcode ให้คำแนะนำอ่านสิ่งที่มันพูดและนำไปปฏิบัติ หวังว่าตอนนี้คุณควรมีมุมมองการทำงานตามความคาดหวังของคุณ :)
สำหรับมุมมองการเลื่อนดูแบบซ้อนหรือแบบซ้อนจะต้องตั้งค่าความกว้างคงที่พร้อมกับมุมมองรูต มุมมองสแต็กหลักที่อยู่ภายในมุมมองเลื่อนจะต้องตั้งค่าความกว้างเท่ากัน [มุมมองเลื่อนของฉันเป็นมุมมองที่ถูกมองข้าม]
ตั้งค่าข้อจำกัดความกว้างเท่ากันระหว่าง UIStackView และ UIScrollView
หากใครที่กำลังมองหา scrollview ในแนวนอน
func createHorizontalStackViewsWithScroll() {
self.view.addSubview(stackScrollView)
stackScrollView.translatesAutoresizingMaskIntoConstraints = false
stackScrollView.heightAnchor.constraint(equalToConstant: 85).isActive = true
stackScrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
stackScrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
stackScrollView.bottomAnchor.constraint(equalTo: visualEffectViews.topAnchor).isActive = true
stackScrollView.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.topAnchor.constraint(equalTo: stackScrollView.topAnchor).isActive = true
stackView.leadingAnchor.constraint(equalTo: stackScrollView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: stackScrollView.trailingAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: stackScrollView.bottomAnchor).isActive = true
stackView.heightAnchor.constraint(equalTo: stackScrollView.heightAnchor).isActive = true
stackView.distribution = .equalSpacing
stackView.spacing = 5
stackView.axis = .horizontal
stackView.alignment = .fill
for i in 0 ..< images.count {
let photoView = UIButton.init(frame: CGRect(x: 0, y: 0, width: 85, height: 85))
// set button image
photoView.translatesAutoresizingMaskIntoConstraints = false
photoView.heightAnchor.constraint(equalToConstant: photoView.frame.height).isActive = true
photoView.widthAnchor.constraint(equalToConstant: photoView.frame.width).isActive = true
stackView.addArrangedSubview(photoView)
}
stackView.setNeedsLayout()
}
วางมุมมองเลื่อนบนฉากของคุณและปรับขนาดเพื่อให้ฉากนั้นเต็ม จากนั้นวางมุมมองสแต็กภายในมุมมองเลื่อนและวางปุ่มเพิ่มรายการภายในมุมมองสแต็ก ทันทีที่ทุกอย่างเข้าที่ให้ตั้งข้อ จำกัด ดังต่อไปนี้:
Scroll View.Leading = Superview.LeadingMargin
Scroll View.Trailing = Superview.TrailingMargin
Scroll View.Top = Superview.TopMargin
Bottom Layout Guide.Top = Scroll View.Bottom + 20.0
Stack View.Leading = Scroll View.Leading
Stack View.Trailing = Scroll View.Trailing
Stack View.Top = Scroll View.Top
Stack View.Bottom = Scroll View.Bottom
Stack View.Width = Scroll View.Width
รหัส: Stack View.Width = Scroll View.Width
เป็นกุญแจสำคัญ
การเพิ่มมุมมองใหม่สำหรับ macOS Catalyst เนื่องจากแอปพลิเคชัน macOS สนับสนุนการปรับขนาดหน้าต่างเป็นไปได้ว่าคุณUIStackView
จะเปลี่ยนจากสถานะที่ไม่สามารถควบคุมได้เป็นเลื่อนได้หรือในทางกลับกัน มีสองสิ่งที่ลึกซึ้งที่นี่:
UIStackView
ถูกออกแบบมาให้พอดีกับทุกพื้นที่ที่ทำได้UIScrollView
จะพยายามปรับขนาดขอบเขตให้เหมาะสมกับพื้นที่ที่ได้รับ / สูญหายใหม่ภายใต้แถบนำทางของคุณ (หรือแถบเครื่องมือในกรณีของแอป macOS)นี่จะเป็นการสร้างวงวนไม่สิ้นสุด ฉันไม่คุ้นเคยกับUIScrollView
มันadjustedContentInset
มากนัก แต่จากบันทึกของฉันในlayoutSubviews
วิธีการของฉันฉันเห็นพฤติกรรมดังต่อไปนี้:
UIScrollView
พยายามหดขอบเขต (เนื่องจากไม่จำเป็นต้องใช้พื้นที่ด้านล่างแถบเครื่องมือ)UIStackView
ดังต่อไปนี้UIScrollView
ไม่พอใจและตัดสินใจที่จะคืนค่าขอบเขตที่ใหญ่กว่า สิ่งนี้รู้สึกแปลกมากสำหรับฉันเนื่องจากสิ่งที่ฉันเห็นจากบันทึกคือUIScrollView.bounds.height == UIStackView.bounds.height
นี้รู้สึกแปลกมากกับผมตั้งแต่สิ่งที่ผมเห็นจากบันทึกว่าUIStackView
ดังต่อไปนี้สำหรับฉันแล้วดูเหมือนว่าสองขั้นตอนจะแก้ไขปัญหาได้:
UIStackView.top
UIScrollView.topMargin
contentInsetAdjustmentBehavior
.never
UIStackView
นี่ฉันกังวลกับมุมมองเลื่อนในแนวตั้งที่มีการเจริญเติบโตในแนวตั้ง สำหรับคู่แนวนอนให้เปลี่ยนรหัสตาม
หวังว่ามันจะช่วยทุกคนในอนาคต ไม่พบใครพูดถึงสิ่งนี้บนอินเทอร์เน็ตและทำให้ฉันต้องเสียเวลานานพอที่จะเข้าใจว่าเกิดอะไรขึ้น