UIScrollview子视图在枚举时显示不正确的帧

时间:2012-07-04 14:55:32

标签: iphone ios uiscrollview subview uiscrollviewdelegate

大家好我有一个问题,我无法理解。

我已将此问题分解为自己的项目,我仍然可以重现它。

我有一个滚动视图说有一个30 uibutton布局。 (例如)

如果我要枚举子视图并记录帧,那么奇数帧将有一个预期的帧

即使在屏幕上绘制了视图

,也会发生这种情况

e.g

viewDidLoad中

 [self.scrollVIew.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        UIButton* view = (UIButton*)obj;

        NSLog(@"%@",NSStringFromCGRect(view.frame));



    }];
  

LOG:

     

2012-07-04 15:46:02.939 BUG SCROLLER [2182:707] {{29,647},{72,37}}

     

2012-07-04 15:46:02.946 BUG SCROLLER [2182:707] {{119,647},{72,37}}

     

2012-07-04 15:46:02.950 BUG SCROLLER [2182:707] {{219,647},{72,37}}

     

2012-07-04 15:46:02.954 BUG SCROLLER [2182:707] {{313,453},{7,7}}

如您所见,底部日志显示完全不正确的帧起源和大小。

奇怪的是,视图的大小似乎总是达到7的大小。

这看似可重复,但在屏幕上看不到

这里发生了什么,我怎么能避免它发生?

谢谢Dan

2 个答案:

答案 0 :(得分:3)

UIScrollView有两个UIImageView子视图 - 每个子视图用于水平和垂直滚动指示器。您需要排除这些视图以获取您正在寻找的帧值。

UIKIT_CLASS_AVAILABLE(2_0) @interface UIScrollView : UIView <NSCoding> {
    ...
    UIImageView* _verticalScrollIndicator;
    UIImageView* _horizontalScrollIndicator;

避免此问题的一种方法是在执行任何工作之前简单地检查每个子视图的类型:

[self.scrollVIew.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if([obj isKindOfClass:[UIButton class]])
{
        UIButton *currentButton = (UIButton *)obj;
        NSLog(@"%@",NSStringFromCGRect(currentButton.frame));
}
}];

由于用于滚动条的每个UIImageView都标记为0,因此第二种方法是使用大于零的值标记每个视图,并将其用作过滤器。这些方面应该有用:

[self.scrollVIew.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
UIView *view = obj;
if(view.tag > 0)
{
        NSLog(@"%@",NSStringFromCGRect(view.frame));
}
}];

答案 1 :(得分:1)

请改为尝试:

[self.scrollVIew.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if([obj isKindOfClass:[UIButton class]])
{
        UIButton *currentButton = (UIButton *)obj;
        NSLog(@"%@",NSStringFromCGRect(currentButton.frame));
}
}];