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バグスクローラー[2182:707] {{29、647}、{72、37}}

2012-07-04 15:46:02.946バグスクローラー[2182:707] {{119、647}、{72、37}}

2012-07-04 15:46:02.950バグスクローラー[2182:707] {{219、647}、{72、37}}

2012-07-04 15:46:02.954バグスクローラー[2182:707] {{313、453}、{7、7}}

ご覧のとおり、下部のログには、フレームの原点とサイズが完全に正しくありません。

奇妙なことに、ビューのサイズが何であれ、私は常に7のサイズになるようです。

これは再現可能に見えますが、画面には表示されません

ここで何が起こっているのですか、どうすればそれが起こらないようにすることができますか?

ありがとうダン

4

2 に答える 2

3

UIScrollViewには、2つのUIImageViewサブビューがあります。水平スクロールインジケーターと垂直スクロールインジケーターのそれぞれに1つずつです。探しているフレーム値を取得するには、これらのビューを除外する必要があります。

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

この問題を回避するための1つのアプローチは、作業を行う前に各サブビューのタイプを確認することです。

[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のタグがあるため、2番目のアプローチは、各ビューにゼロより大きい値をタグ付けし、それをフィルターとして使用することです。これらの線に沿った何かが機能するはずです:

[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 に答える