Tôi có một UIScrollView
cái chứa nhiều UIImageView
s, UILabels, v.v ... các nhãn dài hơn nhiều UIScrollView
, nhưng khi tôi chạy ứng dụng, tôi không thể nhấp và cuộn xuống ...
Tại sao điều này có thể được?
Cảm ơn
Tôi có một UIScrollView
cái chứa nhiều UIImageView
s, UILabels, v.v ... các nhãn dài hơn nhiều UIScrollView
, nhưng khi tôi chạy ứng dụng, tôi không thể nhấp và cuộn xuống ...
Tại sao điều này có thể được?
Cảm ơn
Câu trả lời:
Thật tốt khi hiển thị một đoạn mã làm việc hoàn chỉnh:
// in viewDidLoad (if using Autolayout check note below):
UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set
[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size
Swift 4.0
let myScrollView
let contentView
// scrollview won't scroll unless content size explicitly set
myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size //sets ScrollView content size
Tôi chưa tìm thấy cách đặt contentSize trong IB (kể từ Xcode 5.0) .
Lưu ý: Nếu bạn đang sử dụng Autolayout, nơi tốt nhất để đặt mã này là bên trong -(void)viewDidLayoutSubviews
phương thức.
myScrollView.delegate = self
CSONG, nếu điều này vẫn không hoạt động, câu trả lời bên dưới câu hỏi này có lời khuyên TUYỆT VỜI (hãy truy cập xib / StoryBoard của bạn và đảm bảo "AutoLayout" bị tắt). Pro-Tip: Bạn cũng có thể bao gồm <UIScrollViewDelegate>
trong tệp .h của mình nếu bạn muốn làm những việc như cuộn UIScrollView theo chương trình.
viewDidLayoutSubviews
làm cho nó hoạt động cho tôi.
Nếu bạn không thể cuộn chế độ xem ngay cả sau khi bạn đặt chính xác Kích thước nội dung , hãy đảm bảo bạn bỏ chọn "Sử dụng Tự động thanh toán" trong Trình tạo giao diện -> Trình kiểm tra tệp.
Bạn cần đặt thuộc contentSize
tính của chế độ xem cuộn để cuộn đúng.
Nếu bạn đang sử dụng autolayout, bạn cần phải thiết lập contentSize
trong viewDidLayoutSubviews
để cho nó được áp dụng sau khi Hoàn thành autolayout.
Mã có thể trông như thế này:
-(void)viewDidLayoutSubviews
{
// The scrollview needs to know the content size for it to work correctly
self.scrollView.contentSize = CGSizeMake(
self.scrollContent.frame.size.width,
self.scrollContent.frame.size.height + 300
);
}
contentSize
thành kích thước contentView
, kích thước của scrollView và contentView dường như được đặt như nhau. Nhưng thiết lập chiều cao của contentSize
giá trị lớn hơn chiều cao của contentView
nó, nó đã hoạt động.
viewDidLayoutSubviews
có thể được gọi nhiều lần trong suốt vòng đời để bạn có nguy cơ tăng chiều cao lớn hơn dự kiến.
Câu trả lời ở trên là chính xác - để thực hiện cuộn, cần phải đặt kích thước nội dung.
Nếu bạn đang sử dụng trình xây dựng giao diện, một cách gọn gàng để thực hiện việc này là với các thuộc tính thời gian chạy do người dùng xác định. Ví dụ:
Cố gắng thay đổi kích thước kích thước nội dung thành số lượng lớn. Tôi không thể hiểu tại sao chế độ xem cuộn của tôi không cuộn ngay cả khi kích thước nội dung của nó dường như lớn hơn kích thước kiểm soát. Tôi phát hiện ra rằng nếu kích thước nội dung nhỏ hơn mức cần thiết thì nó cũng không hoạt động.
self.scrollView.contentSize = CGSizeMake(2000, 2000);
Thay vì 2000 bạn có thể đặt số lượng lớn của riêng bạn. Và nếu nó hoạt động, điều đó có nghĩa là kích thước nội dung của bạn không đủ lớn khi bạn thay đổi kích thước.
Đại biểu là không cần thiết để xem cuộn để làm việc.
Đảm bảo rằng bạn có thuộc tính contentSize của chế độ xem cuộn được đặt ở kích thước chính xác (nghĩa là một thuộc tính đủ lớn để bao gồm tất cả nội dung của bạn.)
Trong trường hợp của tôi, tôi phải đặt delaysContentTouches
thành đúng vì các đối tượng bên trong scrollView đều nắm bắt các sự kiện chạm và tự xử lý thay vì để cho scrollView tự xử lý nó.
Đặt contentSize
thuộc tính của UIScrollview
trong ViewDidLayoutSubviews
phương thức. Một cái gì đó như thế này
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
Ý tưởng về lý do tại sao chế độ xem cuộn không cuộn vì bạn đặt kích thước nội dung để cuộn nhỏ hơn kích thước của chế độ xem cuộn, điều này là sai. Bạn nên đặt kích thước nội dung lớn hơn kích thước của chế độ xem cuộn của bạn để điều hướng qua nó trong khi cuộn.
Cùng một ý tưởng với thu phóng, bạn đặt giá trị tối thiểu và tối đa cho thu phóng sẽ được áp dụng thông qua hành động thu phóng.
chào mừng :)
Một bổ sung nhỏ, tất cả ở trên là những lý do thực tế tại sao chế độ xem cuộn của bạn có thể không cuộn nhưng đôi khi vô thức đây có thể là lý do đặc biệt khi scrollview được thêm thông qua mã chứ không phải IB, bạn có thể đã thêm các lượt xem của mình vào chế độ xem phụ huynh chứ không phải cuộn xem điều này làm cho các khung nhìn không cuộn
và giữ kích thước nội dung được đặt và lớn hơn khung xem chính (duhh !!)
Tôi đã làm cho nó hoạt động ở lần thử đầu tiên của tôi. Với bố trí tự động và tất cả mọi thứ, không có mã bổ sung. Sau đó, chế độ xem bộ sưu tập bị hỏng, gặp sự cố khi chạy, tôi không thể tìm thấy cái gì sai, vì vậy tôi đã xóa và tạo lại nó (Tôi đang sử dụng Xcode 10 Beta 4. Cảm giác như một lỗi) và sau đó cuộn đã biến mất. Chế độ xem Bộ sưu tập đã hoạt động trở lại!
Nhiều giờ sau .. đây là những gì đã sửa nó cho tôi. Tôi đã có bố cục như sau:
UIView
Đó là tất cả trong các ràng buộc. Khu vực an toàn được tự động xác định bởi hệ thống. Trong trường hợp xấu nhất, hãy xóa tất cả các ràng buộc cho chế độ xem cuộn và nội dung và không có IB đặt lại / tạo chúng cho bạn. Làm cho chúng bằng tay, nó hoạt động.
về cơ bản, khái niệm này là có Scrollview phù hợp với Chế độ xem Nội dung, phù hợp với Vùng an toàn.
Nhưng như vậy nó không hoạt động. Xem nội dung bỏ lỡ chiều cao. Tôi đã thử tất cả những gì có thể và người duy nhất thực hiện thủ thuật là chiều cao của chế độ xem Nội dung được tạo điều khiển - kéo chế độ xem Nội dung .. sang chính nó . Điều đó đã xác định chiều cao cố định, giá trị này đã được tính từ Kích thước của bộ điều khiển chế độ xem (được xác định là dạng tự do, dài hơn màn hình thực, để chứa tất cả các bản xem trước của tôi) và cuối cùng nó hoạt động trở lại!
Một cái gì đó đã không được đề cập trước đó!
Đảm bảo ổ cắm của bạn được kết nối chính xác với scrollView! Nó nên có một vòng tròn được lấp đầy, nhưng ngay cả khi bạn đã lấp đầy vòng tròn, scrollView có thể không được kết nối - vì vậy hãy kiểm tra kỹ! Di chuột qua vòng tròn và xem nếu cuộn xem thực tế được tô sáng! (Đây là một trường hợp đối với tôi)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
Rất nhiều thời gian mã là chính xác nếu bạn đã làm theo một hướng dẫn nhưng điều mà nhiều người mới bắt đầu không biết là scrollView sẽ KHÔNG cuộn bình thường thông qua trình giả lập. Giả sử chỉ cuộn khi bạn nhấn xuống bàn di chuột và cuộn đồng thời. Nhiều người dùng XCode / Swift / Obj-C có kinh nghiệm thường sử dụng để làm điều này và vì vậy họ không biết làm thế nào nó có thể bị bỏ qua bởi những người mới bắt đầu. Ciao :-)
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}
Mã này sẽ hoạt động hoàn toàn tốt miễn là bạn làm những gì tôi đã nói ở trên
Nếu không có giải pháp nào khác phù hợp với bạn, hãy kiểm tra kỹ xem chế độ xem cuộn của bạn có thực sự là UIScrollView
trong Trình tạo giao diện không.
Tại một số thời điểm trong vài ngày qua, UIScrollView
loại tự nhiên của tôi thay đổi thành một UIView
, mặc dù lớp học của nó nói UIScrollView
trong thanh tra. Tôi đang sử dụng Xcode 5.1 (5B130a)
.
Bạn có thể tạo chế độ xem cuộn mới và sao chép các phép đo, cài đặt và ràng buộc từ chế độ xem cũ hoặc bạn có thể tự thay đổi chế độ xem của mình thành một UIScrollView
trong xib
tệp. Tôi đã làm một so sánh và tìm thấy sự khác biệt sau đây:
Nguyên:
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
Sau khi thay đổi tự phát:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
Vì vậy, tôi đã thay thế <view>
dòng với <scrollView>
dòng ban đầu của tôi .
Tôi cũng thay thế thẻ đóng của view </view>
bằng </scrollView>
.
Hãy chắc chắn giữ id giống như chế độ xem hiện tại, trong trường hợp này: id = "qRn-TP-cXd".
Tôi cũng đã phải xóa xib khỏi bộ đệm của Xcode bằng cách xóa dữ liệu dẫn xuất của ứng dụng:
Xcode->Window->Organizer->Projects
, chọn dự án của bạn, trên dòng Dữ liệu đã tạo, nhấp vào Xóa ...Hoặc nếu sử dụng thiết bị:
Xcode->Window->Organizer->Device
, chọn thiết bị của bạn-> Ứng dụng, chọn ứng dụng của bạn, nhấp (-)Bây giờ làm sạch dự án và xóa ứng dụng khỏi trình giả lập / thiết bị:
Xcode->Product->Clean
Simulator/device->press
và giữ app->click
(X) để xóa nóSau đó, bạn có thể xây dựng và chạy ứng dụng của mình và có chức năng cuộn lại.
PS Tôi không phải đặt kích thước nội dung của chế độ xem cuộn trong viewDidLayoutSubviews
hoặc tắt bố cục tự động, nhưng YMMV.
Nếu bạn scrollView
là người phụ containerView
của một loại nào đó, thì hãy chắc chắn rằng bạn scrollView
đang ở trong khung hoặc giới hạn của containerView
. Tôi containerView.clipsToBounds = NO
vẫn có cho phép tôi xem scrollView, nhưng vì scrollView
không nằm trong giới hạn của containerView
nó sẽ không phát hiện ra các sự kiện chạm.
Ví dụ:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
Bạn sẽ có thể xem scrollView nhưng nó sẽ không nhận được tương tác của người dùng.
thêm mã sau vào viewDidLayoutSubviews
làm việc cho tôi với Autolayout. Sau khi thử tất cả các câu trả lời:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
Thêm UIScrollViewDelegate
và thêm đoạn mã sau vào viewDidAppear
phương thức đã sửa nó cho tôi.
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
Vấn đề của tôi đã được giải quyết bằng cách:
Khi tôi đã loại bỏ các ràng buộc trên và / hoặc dưới cùng bị ràng buộc vào vùng an toàn và / hoặc giám sát, các chế độ xem trong cuộn Xem có thể cuộn lại và không cố định ở phía trên cùng của màn hình!
Hy vọng điều này ngăn người khác khỏi hàng giờ đau đớn với vấn đề đặc biệt này.
một trường hợp thú vị khác:
scrollview.superview.userInteractionEnables phải đúng
Tôi đã lãng phí hơn 2 giờ để theo đuổi điều này chỉ để tìm ra cha mẹ là UIImageView, một cách tự nhiên, có userInteractionEnables == false
Sau khi thất bại với các câu trả lời được cung cấp trong chủ đề này, tôi tình cờ thấy bài viết này với giải pháp.
Có hai điều không trực quan về việc thiết lập scrollview với autolayout:
Đây là ý chính của bài báo đó. Để giải thích đầy đủ, bao gồm cả hình minh họa, hãy kiểm tra nó.
Tôi đã có cùng một vấn đề trong IB.
Sau khi đặt hàng đầu, theo dõi, trên cùng và dưới cùng của scrollView thành superView của nó. Tôi đã thực hiện các thay đổi sau để làm cho containerView có thể cuộn, hoạt động được.
Để làm cho scrollView chỉ cuộn theo hướng ngang, hãy tạo ràng buộc với scrollView's centre = ContainerView's centre
và để làm cho nó có thể cuộn theo chiều dọc, hãy làm cho scrollView's centre = ContainerView's centre