2012-06-10 29 views
8

Tôi đang cố điều chỉnh subviews trong lớp con UIScrollView, nhưng tôi không muốn làm phiền các chỉ báo cuộn. Có vẻ như không có bất kỳ giao diện nào để truy cập chúng và tôi muốn kiểm tra xem một khung nhìn có phải là một trong các chỉ báo cuộn hay không (để tôi có thể bỏ qua nó).Làm cách nào để loại trừ các chỉ số cuộn khi liệt kê các bản xem phụ của UIScrollView?

UIScrollView.h tuyên bố hai Ivars này:

UIImageView* _verticalScrollIndicator; 
UIImageView* _horizontalScrollIndicator; 

... nhưng tôi đã cố gắng sau và có một mối liên kết lỗi:

for(UIView* v in self.subviews) 
{ 
    // Ignore the scroll-indicator views 
    if((v == _horizontalScrollIndicator) || 
     (v == _verticalScrollIndicator)) 
    { 
     continue; 
    } 
    // View is one of mine - do stuff to it... 
} 

của Apple rõ ràng là không muốn bạn rối tung với những, trong trường hợp họ nên làm một cái gì đó thông minh để các mảng trở về từ subviews không bao gồm chúng (đi trên Apple, nó không phải là khó!), nhưng cho đến khi đó làm thế nào tôi có thể bỏ qua chúng?

Trả lời

2

Có lẽ bạn đang kiểm soát các chế độ xem mà bạn đặt trong số UIScrollView. Tại sao không duy trì mảng của riêng bạn chỉ là những quan điểm đó? Bằng cách đó, bạn được an toàn chống lại bất kỳ thay đổi trong tương lai trong việc thực hiện UIScrollView.

+0

Tôi đang viết một lớp con UIScrollView, vì vậy tôi không kiểm soát được các bản xem phụ khác. Tôi đã cố gắng ghi đè didAddSubview: và willRemoveSubview: để theo dõi, nhưng các chỉ số cuộn phải được thêm bình thường giống như bất kỳ chế độ xem nào khác vì chúng cũng kết thúc việc gọi chúng. – jhabbott

+0

Tôi sẽ đi với @KurtRevis trên trang này. Giữ mảng của riêng bạn, duy trì nó bằng cách ghi đè addSubview: và removeSubview: (mà tôi không nghĩ rằng hệ điều hành gọi cho các chỉ số cuộn). Nếu bạn không muốn làm điều đó, thì câu trả lời nhanh chóng và không có sự phụ thuộc của Apple là gắn thẻ các bản phụ đề trên addSubview :. Khi bạn liệt kê các bản xem trước, hãy từ chối các bài đăng có thẻ. Nhược điểm ở đây là bạn sẽ làm hỏng các thẻ cho người dùng của lớp con, những người có thể cần các thẻ còn lại một mình. Các giải pháp khác mà tôi có thể nghĩ là tất cả đều phụ thuộc vào nội bộ của Apple. – danh

+0

Apple sử dụng addSubView: để thêm các chỉ số cuộn nên điều này không thể thực hiện được. Ngoài ra bất cứ điều gì mà không muốn theo dõi các bản xem lại cũng nên theo dõi trong các phương thức insertSubview: *. – jhabbott

0

Chế độ xem chỉ báo cuộn đã được thêm và xóa trong suốt thời gian tồn tại của chế độ xem cuộn hay chúng chỉ được thêm một lần và ẩn và hiển thị khi cần thiết? Nếu đó là sau này, bạn có thể lưu trữ tài liệu tham khảo của riêng bạn cho họ trong init ... thay vì sử dụng các ivars tư nhân và tiến hành như bạn đã cố gắng để đã có.

+0

Thật không may là không - chúng chỉ được thêm khi cần thiết (tức là khi người dùng bắt đầu cuộn) và xóa khi chúng đã biến mất. – jhabbott

+0

Ahh thật đáng thất vọng. – jamesmoschou

1

Tôi đang chống lại cùng một vấn đề và tôi bắt đầu suy nghĩ về việc xem xét các giá trị của hai số UIImageView đó để tìm hiểu xem có hay không. họ có một chữ ký khá độc đáo:

<UIImageView: 0x8ab3e00; frame = (313 812.5; 7 3.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x8ab9740>> 
<UIImageView: 0x8ab3e90; frame = (314.5 522; 3.5 341); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x8ab3f20>> 

giữa các móc khác mà bạn có thể nghe. không lý tưởng nhưng không nhiều trong cách lựa chọn tại thời điểm này ...

là một ví dụ. trong trường hợp này, tôi đã lặp qua các bản xem trước của scrollview để tìm ra chiều cao tối ưu contentSize cho scrollview dựa trên các bản xem trước khi nó bắt đầu xuất hiện với một số giá trị sôi nổi. ..

CGRect contentRect = CGRectZero; 
for (UIView *view in self.myScrollView.subviews) { 
    //exclude scroll bars, the width/height is 3.5 for non-retina or 7 
    //for retina. you can put some logic in here if you like to check 
    //the appropriate 3.5/7.0 values for the respective screen densities 
    if(view.frame.size.width > 7.0f && view.frame.size.height > 7.0f) { 
     contentRect = CGRectUnion(contentRect, view.frame); 
    } 
} 
container.contentSize = CGSizeMake(container.contentSize.width, contentRect.size.height); 

nếu kiểm tra khung của mỗi UIView không đủ cụ thể cho bạn, bạn cũng có thể đảm bảo đó là UIImageView.

Tôi nghĩ đây là giải pháp "đúng" duy nhất tại thời điểm này. cá nhân tôi không phải duy trì một loạt các lượt xem khác.

EDIT:

đây là phương pháp hợp nhất của tôi mà tôi sử dụng:

-(bool)isProbablyAScrollBar:(UIView*)view { 
    CGFloat screenScale = [[UIScreen mainScreen] scale]; 
    return (([view isKindOfClass:[UIImageView class]]) && (view.frame.size.width <= (screenScale*3.5f) || view.frame.size.height <= (screenScale*3.5f))); 
} 
+0

Ý tưởng gọn gàng, mặc dù bị hack và có thể sai (nhưng ít nhất tên phương thức gợi ý điều này). Chỉ cần nghĩ rằng tôi muốn bình luận với một số cải tiến: 1. Cũng như kiểm tra chiều rộng, bạn có thể kiểm tra xem nó gần bên phải (hoặc chiều cao và gần phía dưới). 2. Khung đã được đo theo điểm nên bạn không nên nhân với thang đo của màn hình. – jhabbott

5

này rốt cuộc là tôi làm việc xung quanh

BOOL showsVerticalScrollIndicator = self.showsVerticalScrollIndicator; 
BOOL showsHorizontalScrollIndicator = self.showsHorizontalScrollIndicator; 

self.showsVerticalScrollIndicator = NO; 
self.showsHorizontalScrollIndicator = NO; 

// loop through self.subviews here 

self.showsVerticalScrollIndicator = showsVerticalScrollIndicator; 
self.showsHorizontalScrollIndicator = showsHorizontalScrollIndicator; 
0

Giải pháp của tôi là:

UIView* MYContentView=[[UIView alloc] initWithRect: CGrectMake:(0,0,Scrollview.frame.size.width, scrollview.frame.size.height)]; 

[ScrollView addsubview: MYContentView]; 

Sau đó, tôi đã thêm tất cả các hình ảnh vào MYContentView và sau rescaled các MYContentView và

[ScrollView setContentSize:Cgsize]; 

Bây giờ bạn có thể liệt kê tất cả hình ảnh trong MYContentView mà không lo lắng về thanh cuộn.

Làm:

while ([[MYContentView subviews] count]>0) { 
    [[[MYContentView subviews]lastObject] removeFromSuperview]; 
} 

Removed chỉ những hình ảnh. Hy vọng điều này sẽ giúp

0

Dựa trên phương pháp của MrTristan. Tôi nghĩ anh ta đã nhân lên rất nhiều với quy mô màn hình.

+ (NSArray <UIView *> *)reservedSubviewsInUIScrollView:(UIScrollView *)view 
{ 
    BOOL (^isProbablyAScrollBar)(UIView *s) = ^BOOL(UIView *s) { 
     return [s isKindOfClass:[UIImageView class]] && (s.frame.size.width <= 3.5 || s.frame.size.height <= 3.5); 
    }; 

    NSMutableArray <UIView *> *reserved = [NSMutableArray new]; 
    for(UIView *s in view.subviews) 
    { 
     if(isProbablyAScrollBar(s)) 
     { 
      [reserved addObject:s]; 
     } 
    } 
    return reserved; 
} 
Các vấn đề liên quan