Cách thêm phần đệm hàng đầu để xem được thêm vào trong UIStackView


125

Đây là thiết lập của tôi: Tôi có một UIScrollViewcạnh hàng đầu, hàng đầu, thử nghiệm được đặt thành 0. Bên trong này tôi thêm một UIStackViewvới các ràng buộc này:

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

Trong khung nhìn stack tôi thêm một số khung nhìn.
Vấn đề của tôi là do các ràng buộc, chế độ xem đầu tiên được thêm vào chế độ xem ngăn xếp cũng sẽ có cạnh dẫn = 0.

Các cách mà tôi có thể thêm một số phần đệm vào chế độ xem đầu tiên là gì? Không điều chỉnh các ràng buộc xem cuộn.


2
bạn sẽ thay đổi câu trả lời được chấp nhận? Câu trả lời của Tolga có vẻ tốt hơn nhiều.
Mật ong

Câu trả lời:


26

Giải pháp bạn đã cung cấp không thêm phần đệm cho các chế độ xem của bạn bên trong UIStackView của bạn (như bạn muốn trong câu hỏi), nhưng nó bổ sung thêm phần dẫn đầu cho UIStackView.

Một giải pháp có thể là thêm một UIStackView khác bên trong UIStackView ban đầu của bạn và đưa ra dẫn đầu cho UIStackVIew mới này. Sau đó, thêm quan điểm của bạn vào UIStackView mới này.

Gợi ý, bạn có thể làm điều đó hoàn toàn bằng Trình tạo giao diện. Nói cách khác, không cần phải viết mã cho nó.


373

Khi thuộc isLayoutMarginsRelativeArrangementtính là true, khung nhìn ngăn xếp sẽ bố trí các khung nhìn được sắp xếp của nó so với lề bố cục của nó.

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

Nhưng nó ảnh hưởng đến tất cả các khung nhìn được sắp xếp bên trong đến khung nhìn ngăn xếp. Nếu bạn muốn phần đệm này chỉ cho một chế độ xem được sắp xếp, bạn cần sử dụng lồng nhauUIStackView


2
isLayoutMarginsRelativeArrangementlà một getter, setter là layoutMarginsRelativeArrangement. Tôi không thể chỉnh sửa câu trả lời
maross

5
@maross không có sự khác biệt giữa hàm getter và setter trong Swift. Nhưng bạn đã đúng, những người phát triển với Objective-C nên sử dụng layoutMarginsRelativeArrangementthay thế. Tài liệu chính thức: developer.apple.com/reference/uikit/uistackview/ từ
Tolga Okur

3
Đối với Mục tiêu-C:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Snouto

4
Tháng 2 năm 2019, lúc nửa đêm ngồi tại văn phòng - Những câu trả lời như thế này cho tôi sức mạnh để tiến về phía trước. Cảm ơn @tolpp
nefarianblack

155

Tôi đã thấy rằng các ràng buộc không hoạt động trong Stack View, hoặc chúng có vẻ hơi lạ.

(Chẳng hạn như nếu tôi thêm ràng buộc hàng đầu / theo dõi vào lựa chọn trên stackview hình ảnh, điều đó cũng thêm dẫn đến bộ sưu tập, nhưng không thêm dấu vết; và chắc chắn đó là xung đột).

stackview bên trong stackview

Để đặt lề bố cục cho tất cả các chế độ xem trong stackview, chọn:

Stack View > Size Inspector > Layout Margins > Fixed

Lưu ý: "Fixed"tùy chọn trước đây được gọi "Explicit", như đã thấy trong ảnh chụp màn hình.

Sau đó thêm phần đệm của bạn:

bảng phân cảnh


23
một trong những điều Apple che giấu. Tôi ghét cách Xcode đối lập với sự tốt, thân thiện và dễ dàng. Cảm ơn
Vịt

Xcode tiếp tục gặp sự cố khi tôi thay đổi các lề bố cục rõ ràng đó. Nộp một lỗi nhưng họ trả lời đó là một bản sao.
mvandillen

Đó là những gì tôi không thể tìm thấy trong UI. Thay đổi lề Bố cục thành Hiển thị để xem các trường cho lề Chế độ xem.
pkamb

13
FYI XCode 9 bây giờ gọi đây là "Đã sửa" thay vì "Rõ ràng".
Mel

Cũng trong Xcode 9, bỏ chọn "Sử dụng Hướng dẫn bố cục vùng an toàn" trong Trình kiểm tra tệp, khi viết vẫn gây ra nhiều vấn đề trong IB và tuân theo các hướng dẫn Bố cục thông thường cho các ràng buộc của bạn.
PJ_Finnegan

16

Điều làm việc cho tôi là thêm vào stack để xem một UIView khác chỉ là một spacer (hoạt động ít nhất với stackView.distribution = .ill):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...

6

swift 3: Bạn chỉ cần đặt bù theo:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

Hãy chắc chắn rằng ràng buộc này được đặt sau bạn parentView.addArrangdSubView(firstView)


4

Nếu bạn chỉ cần phần đệm hàng đầu, thì bạn có thể đặt Sắp xếp của chế độ xem ngăn xếp thành "Trailing" và sau đó bạn sẽ được tự do chỉ định các ràng buộc hàng đầu duy nhất trên mỗi lần xem xét có trong nó.

Là một phần thưởng, bạn cũng có thể đặt căn chỉnh của chế độ xem ngăn xếp thành "Trung tâm" và sau đó bạn có thể sử dụng các ràng buộc Hàng đầu và / hoặc Trailing để cung cấp cho mỗi mục một phần đệm riêng ở cả hai bên.


1

Câu hỏi này đã có câu trả lời hay, Mặc dù vậy, một gợi ý, sử dụng thuộc spacingtính để đặt khoảng cách giữa các lượt xem. Đối với các chế độ xem đầu tiên và cuối cùng, có thể có hai tùy chọn, hoặc đặt các phần tử dưới dạng @tolpp được đề xuất hoặc thêm ràng buộc gắn vào cha mẹ (stackview) với hằng số để thêm phần đệm.


0

Những gì chúng tôi đã làm là thêm các thành phần trong suốt (ví dụ: UIButton / UIView) là con đầu tiên và cuối cùng của UIStackView. Sau đó đặt giới hạn chiều rộng của những đứa trẻ vô hình này để điều chỉnh phần đệm.


0

Giải pháp sẽ là có chế độ xem thông thường trong chế độ xem ngăn xếp để giữ bất kỳ chế độ xem nào bạn muốn thêm các ràng buộc và sau đó bạn có thể thêm các ràng buộc cho các mục có liên quan đến chế độ xem trong chế độ xem ngăn xếp. Bằng cách đó, các chế độ xem ban đầu của bạn có thể có các ràng buộc hàng đầu và theo dõi trong chế độ xem ngăn xếp.

Điều này có thể được thực hiện trong trình xây dựng giao diện và lập trình.


-3

Có vẻ như giải pháp này khá đơn giản. Thay vì:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

Tôi vừa viết:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

1
Trên thực tế, mã của bạn thêm phần dẫn đầu cho uistackview bên trong urscrollview, nó không thêm phần đệm cho các quan điểm của bạn bên trong uistackview của bạn, (như câu hỏi nêu rõ)
William Kinaan

Vâng, nhưng tôi không biết nếu bạn có thể thêm phần đệm, vì vậy điều này sẽ làm việc cho tôi.
Adrian

như một suy nghĩ đầu tiên, bạn có thể một uistackview khác bên trong uistackview ban đầu của bạn và cung cấp phần đệm cho nó. sau đó thêm quan điểm của bạn vào uistackview mới này (bạn có thể làm điều đó hoàn toàn bằng trình xây dựng giao diện, không cần phải viết mã cho nó)
William Kinaan

Vâng, điều đó sẽ làm việc. Bạn có thể thêm vào như một câu trả lời và tôi sẽ chấp nhận nó.
Adrian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.