làm cách nào để sử dụng UIScrollView trong Trình tạo giao diện?


95

Mặc dù trước đây tôi đã sử dụng UIScrollViewthành công bằng cách điều khiển nó theo chương trình, nhưng tôi vẫn gặp khó khăn để nó hoạt động bằng cách thiết lập nó độc quyền trong Interface Builder.

Tôi có một trang "giới thiệu" đơn giản trong ứng dụng iPhone của mình. Nó có một UITextView, một số biểu tượng và liên kết đến các ứng dụng khác của tôi. Tôi đã thêm tất cả các chế độ xem này vào của mình UIScrollView, sắp xếp chúng sao cho tổng kích thước của chúng là> 480. Khi tôi khởi chạy ứng dụng của mình, chế độ xem cuộn chỉ hiển thị nội dung vừa với màn hình và không có gì cuộn.

Có thể thực hiện việc này hoàn toàn thông qua IB hay tôi phải thao tác với contentSize thông qua mã?

Câu trả lời:


130

Bạn đã quên đặt thuộc tính contentSize của UIScrollView. Thật kỳ lạ là bạn không thể làm điều này từ Trình tạo giao diện. Bạn sẽ phải làm điều đó từ bộ điều khiển chế độ xem quản lý chế độ xem cuộn này.


42
Wow, loại làm cho IB đúng hơn, vô nghĩa ... Điều này đã làm một mẹo, cảm ơn.
George Armhold

20
Bạn có thể tạo một lớp con của UIScrollvView để kiểm tra xem chỉ có một lần xem phụ ở (0,0) và sau đó tự động đặt contentSize dựa trên chế độ xem phụ đó.
Stefan Arentz

1
Đó là lời khuyên tốt nhất mà tôi nhận được trong một thời gian. Tôi không thể tìm ra lý do tại sao chế độ xem cuộn của mình không hoạt động và không tìm thấy thông tin đó về contentSize ở bất kỳ nơi nào khác. Cảm ơn.
Phi hành đoàn C

46
Tôi đang cố gắng tìm ra cách đặt contentSize trong Interface Builder và tìm thấy cuộc thảo luận này. Ít nhất đối với tôi, trong Xcode 4.5, tôi có thể đặt nó bằng cách sử dụng “Thuộc tính thời gian chạy do người dùng xác định”, bằng cách thêm một mục nhập có tên contentSizeloại Sizevà đặt giá trị mong muốn.
nlogax

5
Tôi vẫn bối rối về lý do tại sao iOS không chỉ tự động đặt contentSizechế độ xem cuộn dựa trên kích thước của các chế độ xem phụ của nó , ít nhất là hành vi mặc định.
aroth

113

Câu trả lời của Boby_Wan khiến tôi suy nghĩ và tôi đã tìm thấy giải pháp sau để định cấu hình ContentSize của UIScrollView từ Trình tạo giao diện:

  1. Chọn cảnh UIScrollViewtrong Bảng phân cảnh
  2. Đi tới Trình kiểm tra danh tính , tạo một Thuộc tính thời gian chạy do người dùng xác định mới (nhấp vào nút +)
  3. Thay đổi thuộc tính Key Path thànhcontentSize
  4. Thay đổi thuộc tính Loại thànhSize
  5. Bây giờ, hãy đặt Giá trị thành { chiều rộng nội dung mong muốn , chiều cao nội dung mong muốn }

ví dụ: đặt giá trị thành {320, 920} sẽ cho phép người dùng cuộn xuống toàn bộ màn hình phụ trên iPhone.

(Tôi đang sử dụng xcode 4.3.3, Mục tiêu triển khai iOS của dự án là 5.1)

Khi tôi thực hiện việc này lần đầu tiên, tôi nhận được lỗi sau:

Cấu hình bất hợp pháp:
     Loại kích thước thuộc tính thời gian chạy do người dùng xác định với các phiên bản Xcode trước 4.3
     MainStoryboard.storyboard

Nếu bạn cũng gặp phải lỗi này, cách khắc phục rất đơn giản: chọn Bảng phân cảnh trong Bộ điều hướng dự án và hiển thị Trình kiểm tra tệp . Tìm / mở rộng phần Tài liệu trình tạo giao diện và có một danh sách thả xuống dành cho Phát triển . Đảm bảo điều này được đặt thànhXcode 4.3


7
Tìm thấy tuyệt vời! Tái bút: Tôi ngạc nhiên vì đây là điều tốt nhất mà Apple có thể làm. Tôi đoán điều này cho thấy ngay cả nhân viên Apple cũng không bao giờ sử dụng công cụ của riêng họ (trình tạo giao diện) :).
Adam

Thật tuyệt vời, điều này vừa hiệu quả với tôi trong Xcode 4.4. Nhưng bây giờ làm cách nào để đặt các nút trên phần của chế độ xem cuộn mà tôi không thể "nhìn thấy" trong IB?
Robert Atkins

1
Tôi vừa giải quyết vấn đề – bạn phải thả lực kéo khi con trỏ vẫn ở bên trong "màn hình", nếu không nó sẽ quay trở lại thời điểm bạn bắt đầu. Thật là một nỗi đau.
Robert Atkins

Tôi đã thử theo cách đó, nhưng tôi gặp lỗi, "this class is not key value coding-compliant for the key keyPath"bạn có thể vui lòng giúp tôi tôi đang làm gì sai không? xin vui lòng lưu ý rằng tôi sử dụng Xamarin-ios-c #
SoftSan

25

Với Autolayout (iOS6 +), bạn có thể tránh cài đặt contentSize. Đặt các ràng buộc sau để thay thế:

  1. Ghim đầu chế độ xem cuộn vào đầu trang con trên cùng của nó.
  2. Và ghim phần dưới cùng vào phần dưới cùng của con dưới cùng của nó.

1
Cảm ơn bạn - Thiết lập contentSizekhông làm việc với Xcode 5 và iOS 7
colincameron

18

Bạn có thể làm điều đó chỉ bằng cách sử dụng Trình tạo giao diện, chuyển đến Trình kiểm tra danh tính (tab trình kiểm tra thứ ba) và thêm thuộc tính Thời gian chạy do người dùng xác định mới với

  • Đường dẫn chính: contentSize
  • Loại: Kích thước
  • Giá trị: {width, height}

14

Bây giờ có một cách để tạo UIScrollViewcuộn mà không cần rời khỏi Storyboard :

  1. Chọn UIScrollViewtrong Bảng phân cảnh, chuyển đến Trình kiểm tra kích thước và thay đổi giá trị Dưới cùng (hoặc bất kỳ giá trị nào khác mà bạn cần thay đổi) trong phần Nội dung nội dung thành chiều cao của vùng nội dung.
  2. Bây giờ, hãy chuyển đến trình kiểm tra Danh tính và tạo một Thuộc tính thời gian chạy do người dùng xác định mới (bằng cách nhấp vào nút +) và đặt tên cho nó contentSize. Bạn điền vào Loại hoặc Giá trị nào không quan trọng (bạn thậm chí có thể để giá trị mặc định của chúng).

Điều này sẽ làm cho UIScrollViewcông việc ổn định, mặc dù tôi không biết tại sao bước thứ hai lại cần thiết (tôi tình cờ phát hiện ra). :(


Thay đổi giá trị Bottom thành gì?
zakdances

Thay đổi chiều cao của vùng nội dung. Nó có vẻ hoạt động và ghi đè giá trị bạn cung cấp cho thuộc tính "contentSize" do người dùng xác định.
Reid Ellis

Đúng, Reid, bạn nói đúng: bạn nên thay đổi giá trị Bottom thành chiều cao của vùng nội dung. Tôi đã chỉnh sửa bài đăng gốc của mình để phản ánh điều này. Cảm ơn bạn!
RoberRM

4

một phương pháp mà tôi đã sử dụng trước đây là kéo chế độ xem cuộn ra khỏi chế độ xem chứa chế độ xem trong trình tạo giao diện và đặt kích thước thực của nó thành kích thước contentSize muốn.

điều vốn dĩ không rõ ràng về trình tạo giao diện là bạn có thể có các chế độ xem không liên kết được lưu trữ trong nib, nhưng không phải là một phần của chế độ xem chính mà nib chủ yếu dành cho.

trong chế độ xem mà bạn muốn chế độ xem cuộn hoạt động, hãy đặt một UIView đơn giản, mà bạn sử dụng làm giá đỡ. (điều này chỉ đơn giản là để bạn có thể thiết kế vị trí của nó một cách trực quan. Nếu bạn chỉ đang sử dụng toàn bộ chế độ xem, bạn có thể bỏ qua bước này và sử dụng đoạn mã thứ hai mà tôi cung cấp ở cuối câu trả lời này).

sau đó, bạn có thể điền vào chế độ xem cuộn bằng các nút điều khiển, trình bày trực quan cách bạn muốn. cung cấp cho cả trình giữ chỗ và thuộc tính chế độ xem cuộn bên trong bộ điều khiển chế độ xem của bạn để bạn có thể truy cập chúng trong thời gian chạy.

trong thời gian chạy, trong - (void) viewDidLoad

scrollView.contentSize = scrollView.frame.size;
scrollView.frame = placeholder.frame;
[placeholder.superview addSubView:scrollView];
[placeholder removeFromSuperview];

cách khác (nếu bạn không sử dụng trình giữ chỗ):

CGRect f = self.view.frame;
scrollView.contentSize = f.size;
f.origin.x = 0;
f.origin.y = 0;
scrollView.frame = f;
[self.view addSubView:scrollView];

cuối cùng, nếu bạn "mất" chế độ xem cuộn của mình trong trình tạo giao diện (có thể đóng nó để nó biến mất khỏi lưới thiết kế), đừng hoảng sợ. chỉ cần nhấp vào nó trong danh sách đối tượng ở bên trái của lưới thiết kế.


1
Cảm ơn - điều này đã hoạt động tốt. Cũng cần khai báo IBOutlets trong YourViewController.h cho trình giữ chỗ và dạng xem cuộn, đồng thời kết nối chúng trong Bộ tạo giao diện. Và cuối cùng, dot.notation không được xCode đánh giá cao ở dòng thứ 3, vì vậy hãy sử dụng cú pháp gửi tin nhắn bình thường - sau đó mọi thứ đều hoạt động tốt!
jiy

đừng lo lắng. Luôn có một mối nguy hiểm khi đăng các đoạn mã mà một số người không thể sử dụng chúng để lấy khái niệm, thay vì mong đợi đoạn mã "chính xác" hoạt động trong mọi tình huống.
không đồng bộ hóa

Đây là phương pháp tôi thực sự sử dụng. Tôi thậm chí không cần phải thay đổi kích thước chương trình này. Tôi nghĩ đó là cách nó dự định được thực hiện. Đó là một câu trả lời đúng.
user4951

Sau khi vẽ nó ra bên ngoài, tôi sẽ chuyển nó sang chế độ siêu xem. Tada.
user4951

Tôi thực sự đã bắt đầu sử dụng thiết kế một số chế độ xem bên ngoài một cảnh cho bàn di chuột và như vậy nó giúp cuộc sống dễ dàng hơn rất nhiều trong một số tình huống thậm chí không liên quan đến cảnh này. Cảm ơn vì câu trả lời này.
Benjamin

4

Trong Xcode 4.5 sử dụng Autolayout, tôi không có phần Nội dung trong trình kiểm tra kích thước của mình. Vì vậy, tôi phải thêm nó vào Thuộc tính thời gian chạy do người dùng xác định và sau đó nó hoạt động tốt.

Những gì bạn thêm vào "Thuộc tính thời gian chạy do người dùng xác định" là keyPath == contentInset thuộc loại "Rect" (UIEdgeInsets, có đầu vào giống như Rect) và được xác định là {trên cùng, bên trái}, {dưới cùng, bên phải}. ContentSize chỉ xác định vùng của cửa sổ scrollview. contentInset xác định vùng có thể cuộn.

Tôi hy vọng điều này sẽ giúp ai đó trong hoàn cảnh tương tự.


Đối với UITextView, hãy sử dụng keyPath "textContainerInset"
Dima Deplov

4

Nhiều câu trả lời ở trên là sai lệch hoặc lỗi thời. Tính đến năm 2017 (có thể sớm hơn nhiều) xây dựng giao diện làm scrollviews hỗ trợ với nội dung tự động kích thước. Bí quyết là XCode mang lại một ý nghĩa đặc biệt, không chuẩn cho các ràng buộc giữa chế độ xem cuộn và nội dung bên trong nó. Những ràng buộc "hướng nội" này sẽ không thực sự ảnh hưởng đến kích thước của nội dung như bạn có thể mong đợi.

Điều này có nghĩa là bạn có thể ghim chế độ xem cuộn xuống dưới cùng của chế độ xem chính với lề bằng 0 và cũng có thể ghim nội dung của chế độ xem cuộn vào cuối chế độ xem cuộn với lề bằng 0, nhưng nội dung sẽ không thực sự bị kéo dài bởi điều này. Thay vào đó, nội dung sẽ có kích thước tự xác định (thêm bên dưới) và đây cũng sẽ là kích thước của vùng có thể cuộn trong chế độ xem cuộn.

Hãy nghĩ về nó như thế này - Có một sự bất đối xứng trong việc ràng buộc các ràng buộc đối với một chế độ xem cuộn: Các ràng buộc từ chế độ xem cuộn đến thế giới "bên ngoài" (mẹ) xác định kích thước và vị trí của chế độ xem cuộn như bình thường. Nhưng những ràng buộc "bên trong" chế độ xem cuộn thực sự là thiết lập kích thước và vị trí của vùng có thể cuộn của chế độ xem cuộn, bằng cách ràng buộc nó với nội dung.

Điều này hoàn toàn không rõ ràng vì khi bạn thiết lập các ràng buộc, XCode sẽ luôn đề xuất khoảng cách hiện tại và có thể bạn sẽ không bao giờ cố tình thay đổi các ràng buộc hướng nội và hướng ngoại theo cách mâu thuẫn. Nhưng bạn có thể và chúng có ý nghĩa được mô tả ở trên: một kiểm soát bố cục chế độ xem cuộn và một kiểm soát kích thước vùng nội dung có thể cuộn.

Tôi tình cờ phát hiện ra điều này và sau đó thấy nó hoạt động như thế nào dẫn tôi đến bài viết này giải thích hoàn toàn về nó và trích dẫn nguồn tài liệu của Apple cho điều này:

https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/

Một thông tin quan trọng cuối cùng, về kích thước tự xác định của nội dung: Bạn có thể cảm thấy rằng bạn đang ở trong một điểm 22 ở đây bởi vì bạn thường đặt kích thước nội dung của mình bằng với chiều rộng của chế độ xem chính, nhưng trong trường hợp này, kích thước chính là chế độ xem cuộn và như mô tả ở trên - ràng buộc sẽ không ảnh hưởng đến kích thước nội dung của bạn. Câu trả lời ở đây là hãy nhớ rằng bạn có thể giới hạn các mục đối với các mục không trực tiếp lân cận trong phân cấp chế độ xem của bạn: ví dụ: Bạn có thể đặt chiều rộng của chế độ xem nội dung của mình bằng chiều rộng của chế độ xem chính thay vì cố gắng vô ích để chế độ xem cuộn thực hiện điều đó cho bạn.


2

Nếu bạn nhấp vào biểu tượng Thuộc tính của bất kỳ Bộ điều khiển Chế độ xem nào trong Trình tạo giao diện, bạn có thể đặt nó thành kích thước "Dạng tự do" trong Chỉ số được mô phỏng và thay đổi kích thước của Chế độ xem chính thành kích thước nội dung mong muốn của bạn.

Bằng cách này, bạn có thể tạo nội dung ScrollView của mình như thể nó là một chế độ xem lớn. Vì nó chỉ là một số liệu mô phỏng của bạn View Controller sẽ được thay đổi kích thước theo giới hạn của cửa sổ khi nó được tải.


2

Thiết lập UIScrollView thông qua Trình tạo giao diện không trực quan. Đây là danh sách kiểm tra của tôi để thiết lập nó:

  1. Chọn tệp XIB của UIViewController. Trong "Trình kiểm tra danh tính" của trình tạo giao diện, hãy thay đổi UIView thành UIScrollView loại lớp

  2. Trong "Trình kiểm tra tệp", bỏ chọn Tự động thanh toán

  3. Trong "Trình kiểm tra thuộc tính", thay đổi kích thước thành Dạng tự do. Sau đó, bạn có thể kéo dài Chế độ xem cuộn theo cách thủ công hoặc bạn có thể chỉ định chiều rộng và chiều cao tùy chỉnh trong "Trình kiểm tra kích thước".

  4. Trong "Trình kiểm tra danh tính", hãy thêm Thuộc tính thời gian chạy do người dùng xác định mới được gọi là "contentSize" thuộc loại "Kích thước" và thay đổi nó thành một giá trị như {320, 1000}. Bạn không thể đặt điều này theo chương trình nữa và do đó cần bước này để Scroll View biết rằng nội dung của Scroll View lớn hơn cửa sổ.


2

Chỉ cần xóa tự động Thanh toán trên chế độ xem cuộn của bạn. thì mã đơn giản như sau:

scrollviewName.contentSize = CGSizeMake(0, 650);

chỉ cần tạo một thuộc tính iboulet trên tệp .h sau đó tổng hợp trên tệp .m. Đảm bảo rằng tính năng cuộn đã được bật.


1

Đúng, st3fan nói đúng , thuộc tính contentSize của UIScrollView phải được đặt. Nhưng bạn không nên tắt tự động thanh toán cho mục đích này. Bạn có thể dễ dàng thiết lập ContentSize của UIScrollView chỉ với tính năng tự động thanh toán trong IB mà không cần bất kỳ mã nào.

Điều quan trọng cần hiểu là khi sử dụng autolayout contentSize của UIScrollView không được đặt trực tiếp, nó được tính toán dựa trên các ràng buộc của tất cả các subview của UIScrollView. Và tất cả những gì bạn cần là cung cấp các ràng buộc thích hợp cho các lượt xem phụ cho cả hai hướng.

Ví dụ: nếu bạn chỉ có một chế độ xem phụ, bạn có thể đặt chiều cao và không gian của nó từ trên xuống dưới thành superview (tức là scrollView trong trường hợp của chúng tôi) contentSize.height được tính bằng tổng

Vertical Space (aSubview.top to Superview.top) + aSubview.height + Vertical Space (aSubview.top to Superview.top)

contentSize.width được tính toán tương tự từ các ràng buộc ngang.

Nếu có quá ít ràng buộc để tính toán kích thước phù hợp, nút nhỏ màu đỏ được hiển thị gần mục View Controller Scene để thông báo về sự không rõ ràng về bố cục.

Nếu có nhiều lượt xem phụ thì đó có thể là "chuỗi" ràng buộc: lượt xem phụ trên cùng đến trên cùng, chiều cao và khoảng cách giữa các lượt xem phụ và lượt xem phụ từ dưới cùng xuống dưới như trong câu trả lời của Danyal Aytekin .

Nhưng trên thực tế trong hầu hết các trường hợp, sẽ thuận tiện hơn khi chỉ cần thêm một chế độ xem trống với kích thước cần thiết và đặt khoảng trắng lên trên, trái, dưới, phải của scrollView thành 0. Bạn có thể sử dụng chế độ xem này làm "Chế độ xem nội dung" tức là đặt tất cả các chế độ xem phụ khác trên đó hoặc nếu bạn đã có nhiều chế độ xem phụ và không muốn di chuyển chúng và thiết lập lại bố cục, bạn có thể thêm chế độ xem bổ trợ này vào các chế độ xem phụ hiện có và ẩn nó đi.

Để làm cho nội dung tính toán có thể cuộn được scrollView, Kích thước phải lớn hơn kích thước scrollView.


1

Bạn có thể có UIScrollView trong StoryBoard với Autolayouts. Về cơ bản những gì bạn cần là:

  1. Thêm UIScrollView
  2. Thêm tất cả các ràng buộc vào nó (như các tấm lót từ các cạnh trên, trái, phải, dưới cùng)
  3. Thêm UIView 'vùng chứa' vào UIScrollView
  4. Nếu bạn chỉ muốn cuộn một hướng (giả sử, dọc): đặt chiều cao rõ ràng (ví dụ: 600) và chiều rộng liên kết với chiều rộng của UIScrollView.
  5. Nếu bạn muốn cuộn hai hướng, chỉ cần đặt cả chiều rộng và chiều cao.

thiết lập bảng phân cảnh



0

Tôi tìm ra một cách thuận tiện hơn.

1: Chia tỷ lệ kích thước của dạng xem cuộn để chứa tất cả ui bên trong nó.

2: Thêm iboutlet của dạng xem cuộn.

3: Trong viewDidLoad, lưu frame.size của dạng xem cuộn.
(ví dụ: _scrollSize = _scrollView.frame.size;)

4: Trong viewWillAppear, đặt contentSize theo CGSize mà bạn đã lưu trước đó.
(ví dụ: _scrollView.contentSize = _scrollSize;)

5: Xong ~


0
  1. Thêm UIViewController
  2. Trong UIViewController 'Trình kiểm tra thuộc tính -> Số liệu được mô phỏng', kích thước đặt Freeform
  3. Trong UIViewController 'Size Inspector -> View Controller', thiết lập chiều cao 800
  4. Thêm UIScrollView trong UIViewController
  5. Thêm tất cả các ràng buộc vào UIScrollView (trên, trái, phải, dưới) và thêm căn chỉnh X = center
  6. Thêm UIView trong UIScrollView
  7. Thêm tất cả các ràng buộc vào UIView (trên, trái, phải, dưới) và thêm căn chỉnh X = center. Có, tương tự như đối với UIScrollView trong # 3, nhưng đối với UIView
  8. Thêm ràng buộc chiều cao vào UIView. Ví dụ 780
  9. Chạy

Bảng phân cảnh


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.