2013-04-11 29 views
1

合成視圖我有一個其由UIView 2 subviews-addSubview的不工作

@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在另一視圖中,我想將其添加爲該視圖(anImageLabelInstance)(mySuperView)的一個實例一個子視圖。 但是,如果直接將此視圖作爲子視圖添加,則不起作用。

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

如果在另一方面,我個人補充意見,這工程─

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

addSubview描述說

如果視圖已經有一個上海華和觀點而不是接收方, 此方法在使接收方 爲其新的超視圖之前移除先前的超視圖。

但是,由於anImageLabelInstance最初並未作爲子視圖添加到此操作之前的任何其他視圖,爲什麼我需要單獨添加視圖?不應該使用addSubview方法添加視圖的所有子視圖嗎?

+0

「不起作用」 - 這是什麼意思?怎麼了?你的意思是你的觀點沒有出現? – occulus 2013-04-11 09:05:59

+0

是的,所有子視圖都會添加以及添加的主視圖。 – occulus 2013-04-11 09:10:41

+0

嘗試在你的類中實現 - (void)dealloc並在其中做一個NSLog。你的NSLog出現了嗎? – occulus 2013-04-11 09:11:43

回答

3

看起來你沒有正確設置2個子視圖的框架。 您將原點傳遞給init方法,並且可以很好地設置框架,而不是子視圖。 (200,200):ANImageLabel視圖將放在你的mySuperView(200,200)上。

如果您隨後將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]; 

,看看它是否被固定。

+0

This Works!感謝您的詳細解釋和修復 – Devang 2013-04-11 18:03:19