0

嗨,伙计们,我有一个问题,我无法解决。

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

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

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

即使在屏幕上绘制了视图,也会发生这种情况

例如

ViewDidLoad

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

        UIButton* view = (UIButton*)obj;

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



    }];

日志:

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

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

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

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

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

奇怪的是,无论视图的大小如何,我似乎总是得到 7 的大小。

这看起来可重现,但在屏幕上不可见

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

谢谢丹

4

2 回答 2

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));
}
}];
于 2012-07-23T21:24:10.353 回答
1

试试这个:

[self.scrollVIew.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if([obj isKindOfClass:[UIButton class]])
{
        UIButton *currentButton = (UIButton *)obj;
        NSLog(@"%@",NSStringFromCGRect(currentButton.frame));
}
}];
于 2012-07-04T15:02:49.867 回答