2012-11-08 66 views
2

我已經做了UIView的一個簡單的子類,它有幾個子視圖,但它的突破我看不到的原因。簡單的自定義UIView類破損

在我的故事板視圖控制器中,我添加了一個UIView,並將其製作爲我想要的形狀,並將其添加到我的自定義類中。我的子類的含量低於:

@implementation PersonDetailCell 

@synthesize button, requiredMarker, textField; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 

    } 
    return self; 
} 

-(void)layoutSubviews 
{ 
    [self setBackgroundColor:[UIColor colorWithRed:87.0f/255.0f green:153.0f/255.0f blue:191.0f/255.0f alpha:1.0f]]; 

    textField = [[DetailTextField alloc] initWithFrame:CGRectMake(10, 0, self.frame.size.width -20, self.frame.size.height)]; 
    [textField setFont:[UIFont fontWithName:@"Helvetica" size:14.0f]]; 
    [textField setTextColor:[UIColor whiteColor]]; 
    [textField setHidden:YES]; 
    [self addSubview:textField]; 

    button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
    [button setHidden:YES]; 
    [self addSubview:button]; 

    requiredMarker = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 4, 22)]; 
    [requiredMarker setBackgroundColor:[UIColor redColor]]; 
    [requiredMarker setHidden:YES]; 
    [self addSubview:requiredMarker]; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

@end 

然後在我的視圖控制器代碼我已經導入我的子類,並迷上了它一個IBOutlet我在我的故事板視圖。在我的視圖控制器的viewDidLoad中,我也嘗試設置這個視圖的背景顏色,但沒有任何反應。

我所有的代碼運行沒有崩潰,但我的問題:

  1. 我無法設置從我的視圖控制器的背景顏色,(或任何其他屬性爲此事)。

  2. 當我運行該應用程序時,高度超過了我在故事板中設置的寬度(寬度很好),但我更改了視圖的高度無處。

任何想法?我以某種方式使用錯誤的方法?

謝謝。

+0

嗯。它將從storyboard獲得initWithCoder:init,但它看起來並不像你在使用該init。你有沒有嘗試在你的vc的viewDidLoad中記錄插座的值?讓我們確保這不是零。此外,layoutSubviews中的斷點也可能是一個很好的診斷。 – danh

+0

關於高度,請檢查故事板中的自動調整遮罩,並確保您添加併成形的視圖沒有可調節的高度設置。 – danh

+0

在viewDidLoad中顯示您嘗試設置背景顏色的代碼。 – rdelmar

回答

1

如果它是一個表格單元格,那麼該類應該擴展UITableViewCell。可以在故事板上添加按鈕和文本框 - 然後您可以使用struts和彈簧(Size Inspector窗格)來確保視圖正確調整大小。我不認爲layoutSubviews應該用於添加新的UI元素(如果需要手動執行,可能需要調整大小)。

+0

這不是一個表格視圖單元格,只是我製作的自定義視圖。如果我不應該在layoutSubviews中添加子視圖,我應該在哪裏? –

+0

嘗試覆蓋控制器中的loadView或viewDidLoad(生命週期細節http://stackoverflow.com/questions/5562938/looking-to-understand-the-ios-uiview-lifecycle)。雖然在那時控制器正在進行繁重的工作。您可以在視圖中嘗試initWithFrame,但我不確定這是否是一種好的做法。 – kat

+0

Apple文檔:http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview。html – kat

0

下面是一些工作代碼:

@interface ChildView() 
@property (strong, nonatomic) UITextField *textField; 
@property (strong, nonatomic) UIButton *button; 
@property (strong, nonatomic) UIImageView *requiredMarker; 
@end 

@implementation ChildView 

@synthesize textField= _textField; 
@synthesize button = _button; 
@synthesize requiredMarker = _requiredMarker; 

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) 
    { 
     [self setBackgroundColor:[UIColor colorWithRed:87.0f/255.0f green:153.0f/255.0f blue:191.0f/255.0f alpha:1.0f]]; 

     self.textField = [[UITextField alloc] init]; 
     [self.textField setFont:[UIFont fontWithName:@"Helvetica" size:14.0f]]; 
     [self.textField setTextColor:[UIColor whiteColor]]; 
     self.textField.text = @"Test text"; 
     [self addSubview:self.textField]; 

     self.button = [[UIButton alloc] init]; 
     self.button.backgroundColor = [UIColor greenColor]; 
     [self addSubview:self.button]; 

     self.requiredMarker = [[UIImageView alloc] init]; 
     [self.requiredMarker setBackgroundColor:[UIColor redColor]]; 
     [self addSubview:self.requiredMarker]; 
    } 
    return self; 
} 

-(void)layoutSubviews 
{ 
    CGSize hostSize = self.frame.size; 
    float length = 22; 
    self.textField.frame = CGRectMake(10, length, hostSize.width, hostSize.height-length); 
    self.button.frame = CGRectMake(0, 0, hostSize.width, length); 
    self.requiredMarker.frame = CGRectMake(0, 0, 4, length); 
} 

@end