2012-11-08 33 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