2015-10-22 18 views
15

Tôi có 2 sự nhầm lẫn về ScrollView. Một là câu hỏi chính của tôi, Một câu hỏi khác là sự nhầm lẫn thứ cấp.Chính xác là gì contentOffset & contentInset of ScrollView

1.What chính xác là contentOffse t & contentInset của scrollview. Tôi sẽ cung cấp thêm chi tiết bên dưới.

2.Tôi tạo ScrollView, nhưng có vẻ như scrollView không thể cuộn theo bất kỳ hướng nào. Có phải vấn đề về bù trừ không? ? Hoặc inset .Tôi sẽ cung cấp thêm chi tiết dưới đây

chi tiết cho câu hỏi 1:

Một thời gian tài sản contentOffset & contentInset tài sản dường như có rất nhiều sự khác biệt, nhưng khi tôi cố gắng thực hiện một số chức năng liên quan đến hai thuộc tính đó, tôi bắt đầu bối rối. Và tôi làm một minh họa đơn giản ở đây. bạn có thể giúp tôi tìm nó ra rằng đó là một phần được bù đắp và phần nào là hình chữ nhật: D

enter image description here

chi tiết cho câu hỏi 2:

tôi sử dụng hàm sau để thêm một scrollview

func addScrollView(){ 
      // assign a new ScrollView to "scroll" class member 
      scroll = UIScrollView(frame: CGRectZero) 
      scroll!.translatesAutoresizingMaskIntoConstraints = false 
      // change it to gray color to help recognising 
      scroll!.backgroundColor = UIColor.grayColor() 
      self.view.addSubview(scroll!) 

      //add some constraints,[you can neglect following part] 
      let x = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0) 
      self.view.addConstraint(x) 

      let y = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1/2, constant: 25) 
      self.view.addConstraint(y) 

      let left = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.LeadingMargin, multiplier: 1, constant: 10) 
      self.view.addConstraint(left) 

      let upperSpacing = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 50) 
      self.view.addConstraint(upperSpacing) 

      let w = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 10) 
      self.view.addConstraint(w) 

      let h = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: scroll!, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0) 
      self.view.addConstraint(h) 
      print("add scroll view Successed") 
     } 

Và không thể cuộn. Nó chỉ có thể chứa vài thứ (Nút hoặc TextFields ...) để lấp đầy kích thước của nó, thay vì đặt nhiều thứ hơn ở những nơi mà chúng ta không thể nhìn thấy.

Vì vậy, các vấn đề về việc thiết lập bắt đầu & là nội tuyến? Làm thế nào tôi có thể thiết lập để sửa lỗi này? Và nếu tôi làm như vậy, làm cách nào tôi có thể thêm mọi thứ (nút ..) vào các địa điểm không được hiển thị?

Tôi hy vọng bạn có thể cho tôi biết một số điều !! (Tôi có nghĩa là nó, thực sự! Tôi al chặn bản thân mình ở đây trong nhiều ngày!)

Trả lời

20

Một vài quan sát:

  • Các contentOffset là nơi người dùng đã hiện cuộn trong tầm nhìn cuộn. Điều này rõ ràng là thay đổi khi người dùng cuộn. Thông thường, bạn không thay đổi điều này theo chương trình (trừ khi bạn muốn cuộn theo chương trình ở đâu đó, ví dụ: có nút để cuộn lên trên cùng).

  • contentInset là nội dung được chèn trực quan bên trong chế độ xem cuộn (tức là "lề" trong cuộn xem là gì). Bạn đặt chung một lần trong IB hoặc trong viewDidLoad, vì chế độ xem cuộn được khởi tạo.

  • contentSize là nội dung có thể cuộn lớn đến mức nào. Lưu ý, với autolayout, bạn không phải chỉ định điều này bằng tay, mà đúng hơn là được tính bằng các ràng buộc mà bạn đã chỉ định giữa chế độ xem cuộn và các bản xem con của nó (và các ràng buộc cho các bản xem trước và giữa các bản xem trước).

Để có được di chuyển để làm việc một cách chính xác, nó là sự kết hợp của (a) bounds của xem di chuyển, trừ contentInset; và (b) contentSize, như được tính cho bạn từ các ràng buộc của các bản xem trước.

+0

Xin chào Rob! Cảm ơn bạn ! Và tôi có thể làm theo đầu tiên 2. Nhưng để đơn giản hóa thứ ba, tôi muốn xác nhận rằng "nội dung có thể cuộn" liều đó đơn giản có nghĩa là kích thước của scrollView? – Microos

+1

Không, bởi "nội dung có thể cuộn" Tôi đang đề cập đến tất cả các bản xem trước của chế độ xem cuộn. Và nếu tất cả các bản xem trước đó có ràng buộc của chúng được xác định đầy đủ, thì 'contentSize' của chế độ xem cuộn sẽ được tính và đặt cho bạn. Vì vậy, hãy tưởng tượng rằng chế độ xem cuộn của bạn có chiều cao 480 điểm, nhưng chiều cao (như các ràng buộc) của tất cả các bản xem trước và khoảng cách của chúng được thêm tối đa 700 điểm ('contentSize.height' là 700), sau đó bạn có thể cuộn 700 điểm nội dung lên và xuống trong chế độ xem cuộn 480 điểm. – Rob

2

contentOffset cho biết vị trí hiện tại của nội dung dạng cuộn, liên quan đến tọa độ gốc ở góc trên cùng bên trái. Bạn không nên đặt giá trị này theo chương trình trừ khi bạn muốn điều chỉnh vị trí cuộn theo chương trình.

contentInset cho phép chỉ định lề xung quanh nội dung trong chế độ xem cuộn. Bạn có thể chỉ định lề lập trình như sau:

scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0) 
+0

Xin chào! Eneko Alonso! Cảm ơn câu trả lời của bạn lúc đầu! Tôi muốn hỏi rằng thiết lập nội bộ được lập trình có ý định tạo một vùng nhỏ hơn để người dùng xem nội dung. Tôi có đúng không? – Microos