2014-10-12 76 views
0

我分爲UIImageViewUIView用於生成帶數字的簡單顏色圖塊。如果我使用UIImageView,我使用initWithImage方法。如果我使用UIView,則正在使用方法initWithFrame。 紅色正方形圖像或以編程方式生成的紅色視圖用於初始化。
在兩個屏幕截圖上可以看到問題:使用initWithImage時 - 一切正常。如果正在使用initWithFrame方法,我將以多個白色視圖結束,而不會以普通視圖的順序創建任何信息。所有的截圖和代碼附加。initWithImage工作正常initWithFrame被調用不止一次

此使用initWithImage初始化時,它的外觀: initWithImage

- (id)initWithImage:(UIImage *)image { 
    self = [super initWithImage:image]; 
    if (self) { 
//Some non-important, label-related stuff. 
     [self addSubview:self.numberLabel]; 
    } 
    return self; 
} 

,這是它的外觀與initWithFrame
initWithFrame

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.redView = [self redViewWithFrame:frame]; 
     [self addSubview:self.redView]; 
//label-related stuff 
    } 
    return self; 
} 


- (UIView *)redViewWithFrame:(CGRect)frame { 
    UIView *view = [[UIView alloc] initWithFrame:frame]; 
    view.backgroundColor = [UIColor redColor]; 
    view.alpha = 1; 
    return view; 
}  

而且for循環,調用這些初始化來自另一個類(UIScrollView子類)。標籤值在視圖初始化後設置。

- (void)setNumberOfBlocks:(NSInteger)numberOfBlocks { 
    _blocks = [[NSMutableArray alloc] init]; 

    CGSize contentSize; 
    contentSize.width = BLOCK_WIDTH * (numberOfBlocks); 
    contentSize.height = BLOCK_HEIGHT; 

    self.contentSize = contentSize; 

    for (int i = 0; i < numberOfBlocks; i++) { 
     CGFloat totalWidth = BLOCK_WIDTH * i; 
     CGRect frame = CGRectMake(0, 0, BLOCK_WIDTH, BLOCK_HEIGHT); 

     frame.origin.x = totalWidth; 


     BlockView *view = [[BlockView alloc] initWithImage:[UIImage imageNamed:@"block.png"]]; 
     OR!!! 
     BlockView *view = [[BlockView alloc] initWithFrame:frame]; 


     view.frame = frame; 
     NSString *number = [NSString stringWithFormat:@"%ld", (long)i + 1]; 
     view.numberLabel.text = number; 


     [self addSubview:view]; 
     [_blocks addObject:view]; 
    } 
} 

谷歌搜索給我的印象是這是非常普遍的問題,但我還沒有找到任何解決方案如何擊敗這個。而且,我還是不明白,爲什麼數字是完全正確的,唯一的問題就是觀點的位置。

回答

1

的問題是,你的紅色視圖框設置爲上海華盈的框架,而不是其界限。由於紅色視圖是BlockView的子視圖,因此它的框架需要相對於它的超級視圖,您可以通過界限獲得它(不清楚爲什麼您甚至需要紅色視圖,而不是將塊視圖的背景顏色設置爲紅)。

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.redView = [self redViewWithFrame:self.bounds]; 
     [self addSubview:self.redView]; 
//label-related stuff 
    } 
    return self; 
} 
+0

儘管這兩個解決方案都對我有幫助,但我決定使用rdelmar的解決方案,因爲它更好(邊界實際上是將原點設置爲(0,0)的框架)。出於某種原因,我決定使用redView而不是backgroundColor屬性 - 這是正確的方法。在項目的某些部分我使用backgroundcolor,也許這是舊的部分...所以,謝謝你。儘管如此,你的答案對我有很大的幫助,因爲在標籤初始化時,它更好地使用邊界而不是幀。我想離開的唯一的意見是,你應該使用'self.bounds'訪問器來調用邊界,而不僅僅是'bounds'。 – 2014-10-12 03:20:35

+1

@RichardTopchiy,是離開自己是一個錯字。 – rdelmar 2014-10-12 04:05:09

1

我想你應該設置幀原點(0,0)在redViewWithFrame在公共秩序有重疊的觀點

+0

你的解決方案也運行良好,你回答第一,但我決定選擇rdelmar的答案,因爲它更正確(使用邊界,而不是改變框架的屬性)。不過,從我的+1! =) – 2014-10-12 03:25:02