1

私はUIView2つのサブビューで構成されています-

@interface ANImageLabel : UIView

@property (strong, nonatomic) UIImageView *imageView;
@property (strong, nonatomic) UILabel *label;

- (id)initWithFrameAtOrigin:(CGPoint)origin imageViewSize:(CGSize)imageViewSize labelSize:(CGSize)labelSize;

@end

- (id)initWithFrameAtOrigin:(CGPoint)origin imageViewSize:(CGSize)imageViewSize labelSize:(CGSize)labelSize
{
    CGRect frame = CGRectZero;
    frame.origin = origin;

    // height should be the max of both heights
    CGFloat height = MAX(imageViewSize.height, labelSize.height);
    CGFloat width = imageViewSize.width + labelSize.width;
    imageViewSize.height = labelSize.height = frame.size.height = height;
    frame.size.width = width;

    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        CGRect imageViewFrame = CGRectZero;
        imageViewFrame.origin = origin;
        imageViewFrame.size = imageViewSize;
        self.imageView = [[UIImageView alloc] initWithFrame:imageViewFrame];
        self.imageView.contentMode = UIViewContentModeCenter;
        [self addSubview:self.imageView];

        CGRect labelFrame = CGRectZero;
        labelFrame.origin.x = origin.x + imageViewSize.width;
        labelFrame.origin.y = origin.y;
        labelFrame.size = labelSize;
        self.label = [[UILabel alloc] initWithFrame:labelFrame];
        [self addSubview:self.label];
    }
    return self;
}

サブビューとして追加したい別のビュー ( ) 内alloc-initのこのビュー ( ) のインスタンスです。ただし、このビューをサブビューとして直接追加すると機能しません。anImageLabelInstancemySuperView

[mySuperView addSubview:anImageLabelInstance]; <--- DOESN'T WORK, WHY?

一方、ビューを個別に追加すると、機能します-

    [anImageLabelInstance.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
        [mySuperView addSubview:view];
    }];

の説明はaddSubview言う

ビューに既にスーパービューがあり、そのビューがレシーバーでない場合、このメソッドはレシーバーを新しいスーパービューにする前に以前のスーパービューを削除します。

ただし、anImageLabelInstanceこの操作の前に、もともと他のビューにサブビューとして追加されていないため、ビューを個別に追加する必要があるのはなぜですか? ビューのすべてのサブビューもメソッドで追加されるべきではありませんaddSubviewか?

4

1 に答える 1

3

2 つのサブビューのフレームを正しく設定していないようです。原点を init メソッドに渡します。ANImageViewフレームは設定できますが、サブビューは設定できません。

原点 (200, 200) を渡すとしましょう: ANImageLabel ビューは(200, 200) のmySuperViewに配置されます。

その後、2 つのサブビューを同じ原点に設定すると、ANImageLabel フレームに対して座標 (200, 200) に配置されるため、実際のビュー フレームからはみ出す場合があります。より正確には

|''''''''''''''| -> your mySuperView
|              |
|              |
|              |
|              |
|    |''''|--- |----> you ANImageView on (200, 200)
|    |    |    |
|    ''''''    |
|              |
|           ---|-------> somewhere around here (but inside the ANImageView) you have your 2 
|              |         subviews, centered in relation to the ANImageViewFrame (so (400, 400)  
''''''''''''''''         in relation to the mySuperView)

この場合、2 つのサブビューは ANImageView の表示領域の外にあるため、非表示になります。もちろん、それらを個別に拾い上げてmySuperViewに直接配置すると、それらの原点 (200, 200) は実際にはmySuperViewフレームに相対的になり、おそらくその可視領域にあるため、非表示にはなりません。

これを回してみてください:

        CGRect imageViewFrame = CGRectZero;
        imageViewFrame.origin = origin;
        imageViewFrame.size = imageViewSize;
        self.imageView = [[UIImageView alloc] initWithFrame:imageViewFrame];
        self.imageView.contentMode = UIViewContentModeCenter;
        [self addSubview:self.imageView];

        CGRect labelFrame = CGRectZero;
        labelFrame.origin.x = origin.x + imageViewSize.width;
        labelFrame.origin.y = origin.y;
        labelFrame.size = labelSize;
        self.label = [[UILabel alloc] initWithFrame:labelFrame];
        [self addSubview:self.label];

これに:

    CGRect imageViewFrame = CGRectZero;
    imageViewFrame.origin = CGPointMake(0,0);
    imageViewFrame.size = imageViewSize;
    self.imageView = [[UIImageView alloc] initWithFrame:imageViewFrame];
    self.imageView.contentMode = UIViewContentModeCenter;
    [self addSubview:self.imageView];

    CGRect labelFrame = CGRectZero;
    labelFrame.origin.x = imageViewSize.width;
    labelFrame.origin.y = 0;
    labelFrame.size = labelSize;
    self.label = [[UILabel alloc] initWithFrame:labelFrame];
    [self addSubview:self.label];

修正されるかどうかを確認します。

于 2013-04-11T10:27:13.430 に答える