10

我正在尝试subviewsUIScrollView子类中调整我的,但我不想打扰滚动指示器。似乎没有任何公共接口可以访问这些,我想检查视图是否是滚动指示器之一(以便我可以忽略它)。

UIScrollView.h声明这两个 iVar:

UIImageView* _verticalScrollIndicator;
UIImageView* _horizontalScrollIndicator;

...但我尝试了以下操作并收到链接器错误:

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...
}

Apple 显然不希望你弄乱这些,在这种情况下,他们应该做一些聪明的事情,以便从返回的数组subviews不包含它们(来吧 Apple,这并不难!),但在那之前我怎么能忽略它们?

4

6 回答 6

6

这最终成为我的解决方法

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;
于 2015-01-13T21:47:42.293 回答
2

大概您可以控制放入UIScrollView. 为什么不维护自己的视图数组呢?这样,您就可以安全地应对 UIScrollView 实现中的任何未来更改。

于 2012-06-10T01:28:12.230 回答
1

我遇到了同样的问题,我开始考虑查看这两个UIImageViews 的值,以确定它们是否存在。他们确实有一个非常独特的签名:

<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>>

在您可以听的其他钩子中。不理想,但在这一点上的选择方式不多......

这是一个例子。在这种情况下,我在滚动视图的子视图中循环,以根据子视图找出滚动视图的最佳contentSize高度,当它开始出现一些时髦的值时,这让我认为是滚动条在搞砸我.. .

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);

如果检查每个 UIView 的框架对您来说不够具体,您还可以确保它是一个 UIImageView。

我认为这是目前唯一的“真正”解决方案。我个人宁愿不必维护另一组观点。

编辑:

这是我使用的综合方法:

-(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)));
}
于 2014-02-13T23:05:42.857 回答
0

滚动指示器视图是在滚动视图的整个生命周期中添加和删除的,还是只添加一次并在必要时隐藏和显示?如果是后者,您可以将自己对它们的引用存储在 init... 而不是使用私有 ivars 并按照您已经尝试过的方式继续。

于 2012-06-23T11:32:22.647 回答
0

我的解决方案是:

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

[ScrollView addsubview: MYContentView];

然后我将所有图像添加到 MYContentView 中,然后重新调整了 MYContentView 和

  [ScrollView setContentSize:Cgsize];

现在您可以枚举 MYContentView 中的所有图像,而无需担心滚动条。

正在做:

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

只删除了图像。希望这可以帮助

于 2015-02-13T11:08:57.027 回答
0

基于 MrTristan 的方法。我认为他错误地乘以屏幕比例。

+ (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;
}
于 2016-06-01T11:35:10.330 回答