2012-06-30 32 views
14

Vì vậy, trong một UITableView khi bạn có phần xem phần dính vào đầu cho đến khi phần tiếp theo chồng chéo nó và sau đó nó thay thế nó trên đầu trang. Tôi muốn có một hiệu ứng tương tự, nơi mà về cơ bản tôi có một UIView trong UIScrollView của tôi, đại diện cho các phần UIView và khi nó chạm vào đầu .. Tôi muốn nó ở lại đó và không được thực hiện. Làm thế nào để tôi làm điều này? Tôi nghĩ rằng điều này cần phải được thực hiện trong cả layoutSubviews hoặc scrollViewDidScroll và thực hiện thao tác trên UIVIew ..làm cho UIView trong UIScrollView dính lên trên cùng khi cuộn lên

Trả lời

2

Nếu tôi nhớ chính xác, bản trình bày 2010 WWDC ScrollView thảo luận chính xác cách giữ chế độ xem ở vị trí cố định trong khi các yếu tố khác cuộn xung quanh . Xem video và bạn nên có cách tiếp cận rõ ràng để triển khai.

Về cơ bản, việc cập nhật khung dựa trên các cuộc gọi lại scrollViewDidScroll (mặc dù bộ nhớ hơi mờ về các điểm tốt hơn).

+0

hmm .. về cơ bản bạn phải kiểm tra xem phần UIView có nằm trên đầu và sau đó giữ nó ở đó phải không? Vấn đề của tôi là làm cách nào để xác định xem UIView được chia nhỏ có nằm trên "top" – xonegirlz

+0

Để xác định chế độ xem nào ở trên cùng hay không, bạn có thể yêu cầu người giám sát xem đó là một loạt các bản xem trước, ví dụ: NSArray * subviews = [superview subviews]. Sau đó, yêu cầu mảng của bạn cho các chỉ mục của các bản xem phụ bạn muốn so sánh, ví dụ: NSUInteger oneIndex = [subviews indexOfObject: viewOne], haiIndex = [subviews indexOfObject: viewTwo]. Một khi bạn đã đi các chỉ mục cho cả hai bản xem trước, chỉ cần đánh giá cái nào là lớn hơn để xác định cái nào nằm trên đầu trang của cái kia. – isaac

+0

khi tôi nói trên đầu, không có nghĩa là trên đầu trang của mỗi khác .. nhưng tôi có nghĩa là đó là contentOffSet.y – xonegirlz

19

Để tạo UIView trong UIScrollView dính vào đầu khi cuộn lên làm:

- (void)createHeaderView:(UIView*)headerView { 
    _headerView = [headerView retain]; 
    _headerViewInitialY = _headerView.frame.origin.y; 
    [_scrollView addSubview:_headerView]; 
    _scrollView.delegate = self; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGRect headerFrame = _headerView.frame; 
    headerFrame.origin.y = MAX(_headerViewInitialY, scrollView.contentOffset.y); 
    _headerView.frame = headerFrame; 
} 
+1

Thực sự có vẻ tốt – svmrajesh

+2

Đảm bảo rằng chế độ xem bạn dự định bắt cuộn có bộ đại biểu và đại biểu đó là nơi scrollViewDidScroll sẽ hoạt động. Nếu bạn để cho trình điều khiển của bạn thực hiện giao thức , bạn có thể gán ủy nhiệm là 'self' trong controller như [this] (http://stackoverflow.com/a/14096093) –

+0

Tôi đã thử nó và nó hoạt động tốt nhưng quan điểm của tôi nhận được mờ và tôi đã thử tất cả mọi thứ nhưng không thành công, vì vậy xin vui lòng bạn có thể giúp tôi cách hay lý do tại sao nó đang xảy ra. Nó chỉ nhận được mờ trong một thời gian cho đến khi nó dính vào đầu – Soniya

9

Swift Giải pháp dựa trên phản ứng EVYA của:

var navigationBarOriginalOffset : CGFloat? 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    navigationBarOriginalOffset = navigationBar.frame.origin.y 
} 

func scrollViewDidScroll(scrollView: UIScrollView) { 
    navigationBar.frame.origin.y = max(navigationBarOriginalOffset!, scrollView.contentOffset.y) 
} 
2

giải pháp Evya của hoạt động thực sự tốt, tuy nhiên nếu bạn sử dụng Auto Bố cục, bạn nên làm một cái gì đó như thế này (Cú pháp bố cục tự động được viết bằng Masonry, nhưng bạn có ý tưởng.):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    //Make the header view sticky to the top. 
    [self.headerView mas_remakeConstraints:^(MASConstraintMaker *make) { 
     make.top.equalTo(self.scrollView.mas_top).with.offset(scrollView.contentOffset.y); 
     make.left.equalTo(self.scrollView.mas_left); 
     make.right.equalTo(self.scrollView.mas_right); 

     make.height.equalTo(@(headerViewHeight)); 
    }]; 

    [self.scrollView bringSubviewToFront:self.headerView]; 
} 
+2

Thật không may này buộc bạn phải tái tạo các ràng buộc bố trí với mỗi khung di chuyển di chuyển. Thay vào đó, những gì bạn nên làm là có một thùng chứa chứa 'UIScrollView' và làm cho đầu trang bằng với đầu * của * container, chứ không phải phần bù đầu nội dung của scrollview. Làm theo cách này cho phép bạn thiết lập các ràng buộc một lần. –

+0

mas_updateConstraints – Jaro

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