2016-09-19 16 views
9

Tôi đang gặp sự cố với các ràng buộc trên UIScrollView dường như là iOS10 cụ thể. Tôi dường như có một khoảng cách giữa đầu của chế độ xem cuộn và chế độ xem nội dung ở bên trong, được cho là bị mắc kẹt ở đầu.Khoảng cách ở trên cùng của UIScrollView trên iOS10

Dường như không có bất kỳ khoảng trống nào trên iOS 9, nhưng trên iOS 10 khoảng trống xuất hiện.
Để rõ ràng, trong cả hai trường hợp, đầu xem cuộn được ghim vào phần dưới cùng của hướng dẫn bố cục trên cùng, đường thẳng đứng ở phía dưới cùng của thanh điều hướng một cách hoàn hảo. iOS 10 giới thiệu một khoảng trống kích thước của thanh điều hướng giữa đầu chế độ xem cuộn và phần đầu của chế độ xem nội dung.

Tôi có thể căn chỉnh đầu chế độ xem cuộn lên đầu hướng dẫn bố cục hàng đầu, điều này sẽ đặt khoảng cách bên dưới thanh điều hướng và chế độ xem nội dung sẽ xếp hàng tốt, nhưng trên iOS 9, chế độ xem nội dung sẽ ở bên dưới thanh điều hướng không mong muốn.

Tôi đã nhanh chóng tạo một số mã sân chơi thể hiện sự cố bên dưới. Có điều gì rõ ràng tôi đang thiếu? Điều gì đã thay đổi trong iOS 10 để làm cho vấn đề này xảy ra và tôi làm cách nào để giải quyết vấn đề này?

comparison of screenshots from iPhone 5s simulator

import UIKit 
import PlaygroundSupport 

class TestViewController: UIViewController { 
    var mainScrollView: UIScrollView 
    var contentView: UIView 

    init() { 
     self.mainScrollView = UIScrollView() 
     self.contentView = UIView() 

     super.init(nibName: nil, bundle: nil) 

     self.view.backgroundColor = UIColor.white 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func viewDidLoad() { 
     self.mainScrollView.backgroundColor = UIColor.green 
     self.contentView.backgroundColor = UIColor.blue 

     self.mainScrollView.translatesAutoresizingMaskIntoConstraints = false 
     self.contentView.translatesAutoresizingMaskIntoConstraints = false 

     self.view.addSubview(self.mainScrollView) 
     self.mainScrollView.addSubview(self.contentView) 

     // constrain the scroll view bounds to the view 
     self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.topLayoutGuide, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0)) 
     self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.bottomLayoutGuide, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0)) 
     self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0)) 
     self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0)) 

     // constrain the content view bounds to the scroll view 
     self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0)) 
     self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0)) 
     self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0)) 
     self.mainScrollView.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.mainScrollView, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0)) 

     // constrain the content view's size to the view's size 
     self.view.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.width, multiplier: 1, constant: 0)) 
     self.view.addConstraint(NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.greaterThanOrEqual, toItem: self.view, attribute: NSLayoutAttribute.height, multiplier: 1, constant: 0)) 
    } 
} 

let rootViewController = TestViewController() 
rootViewController.title = "Test" 

let navigationController = UINavigationController(rootViewController: rootViewController) 
PlaygroundPage.current.liveView = navigationController.view 
+0

Tôi gặp sự cố tương tự ... chỉ xảy ra trong iOS 10. Bạn có may mắn sửa chữa nó không? – inorganik

+0

@inorganik - Chưa, chưa. Chỉ cần di chuyển trên với dự án một để lại nó tại chỗ cho bây giờ. Có thể cuối cùng phải đưa vào một phiên bản hệ điều hành kiểm tra, mà tôi hy vọng để tránh. –

+0

Đã thêm giải pháp mà tôi đã tìm thấy làm câu trả lời, hy vọng nó phù hợp với bạn. – inorganik

Trả lời

1

Trong chế đầu tiên bạn được thiết lập mà bạn đặt nó vào topLayoutGuidebottom. Vì vậy, từ Apple documentation, số bottom của số topLayoutGuide phụ thuộc vào cách bạn sắp xếp các bản xem phụ của mình. Vì vậy, trong ví dụ của bạn nếu bạn đặt nó thành

self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: .top, relatedBy: .equal, toItem: self.topLayoutGuide, attribute: .top, multiplier: 1, constant: 0)) hoạt động.

Nhưng tôi thường xuyên sử dụng phần trên cùng của chế độ xem phụ để không có "lề". Vì vậy, nó có thể trông giống như: self.view.addConstraint(NSLayoutConstraint(item: self.mainScrollView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 0)).

Hy vọng điều đó sẽ hữu ích.

+0

Tôi cách xa máy tính của mình để tôi không thể kiểm tra lại tại Khoảnh khắc, nhưng tôi khá chắc chắn nếu tôi đặt nó lên trên cùng của hướng dẫn bố cục hàng đầu nó thực sự hoạt động trên iOS 10, nhưng trên iOS 9 nó kết thúc lên phía sau thanh điều hướng, mà tôi đang cố gắng tránh, đó là tại sao tôi không đi với việc xếp nó lên đỉnh của người giám sát. –

+0

Chỉ cần thêm vào phần này, đầu của chế độ xem cuộn ở vị trí tôi muốn trên cả iOS 9 và iOS 10: Phù hợp với phần dưới cùng của thanh điều hướng. Vấn đề là khoảng cách giữa đầu của chế độ xem cuộn và đầu chế độ xem nội dung.Nếu tôi di chuyển chế độ xem cuộn lên trên cùng của hướng dẫn bố cục trên cùng, trên iOS 10 phần đầu của chế độ xem cuộn nằm bên dưới thanh điều hướng và chế độ xem nội dung phù hợp với thanh điều hướng. Trên iOS 9, chế độ xem nội dung cũng nằm bên dưới thanh điều hướng. –

0

Tôi đã có cùng một vấn đề này, trong trường hợp của tôi cho một UISearchController, trong đó việc bổ sung chế độ xem được thực hiện động vì vậy tôi sẽ không có dịp thêm ràng buộc. Tôi chỉ cần thiết lập theo cách thủ công contentInset của chế độ xem cuộn (trong trường hợp của tôi là chế độ xem bảng) và đặt nó ở khoảng cách từ đầu màn hình bạn muốn. Đối với bạn, nó có thể trông giống như sau:

// status bar + nav bar = 64 
self.mainScrollView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0); 
self.view.automaticallyAdjustsScrollViewInsets = NO; 

Xin lưu ý rằng tôi đã điều chỉnh điều này để nhanh chóng từ Obj của tôi. Mã C nên xin lỗi nếu nó hơi tắt. Tôi đã thử nghiệm trong iOS 9 và 10 và nó có vẻ đúng trong cả hai.

Các vấn đề liên quan