2015-04-30 85 views
2

这里是我有的代码...这是一个简单的问题...也许我不应该用UIView做...但我只是想绘制一条装饰水平线来分隔内容。我得到的是没有错误,这条线没有画出来。如果我用框架初始化它并关闭自动布局,那么我确实看到了该行,但这不是我想要实现的方式,因为所有内容都是自动布局的。如何使用UIView和自动布局绘制水平线?

在viewDidLoad下面调用其他方法来创建UI元素并添加约束。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Add main layout 
    [self.scrollView addSubview:self.profileInfoContainer]; 

    // Add UI elements 
    [self.profileInfoContainer addSubview:self.email]; 
    [self.profileInfoContainer addSubview:self.userName]; 
    [self.profileInfoContainer addSubview:self.hLineSeperator]; 
    [self.profileInfoContainer addSubview:self.navigationContainer]; 

    // Add Constraints 
    [self addInfoContainerConst]; 

} 

下面我添加的约束在profileInfoContainer所有UI元素,包括hLineSeperator

- (void)addInfoContainerConst { 

     // Add constrains 
     NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_userName, _email, _hLineSeperator, _navigationContainer); 
     NSDictionary *metrics = @{ 
            @"vTop":@60, 
            @"vBttm":@5, 
            @"hLeft":@25, 
            @"hRight":@25, 
            @"vMiddle":@5 
            }; 

     NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-vTop-[_userName]-vMiddle-[_email]-vMiddle-[_hLineSeperator]-vMiddle-[_navigationContainer]|" 
                      options:0 
                      metrics:metrics 
                       views:viewsDictionary]; 

     NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-hLeft-[_userName]-hRight-|" 
                      options:0 
                      metrics:metrics 
                       views:viewsDictionary]; 

     NSArray *constraint_POS_H_1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-hLeft-[_email]-hRight-|" 
                      options:0 
                      metrics:metrics 
                       views:viewsDictionary]; 

     NSArray *constraint_POS_H_2 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_hLineSeperator(1)]|" 
                      options:0 
                      metrics:metrics 
                       views:viewsDictionary]; 

     NSArray *constraint_POS_H_3 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_navigationContainer]|" 
                       options:0 
                       metrics:metrics 
                       views:viewsDictionary]; 

     [self.profileInfoContainer addConstraints:constraint_POS_V]; 
     [self.profileInfoContainer addConstraints:constraint_POS_H]; 
     [self.profileInfoContainer addConstraints:constraint_POS_H_1]; 
     [self.profileInfoContainer addConstraints:constraint_POS_H_2]; 
     [self.profileInfoContainer addConstraints:constraint_POS_H_3]; 
    }  

下面是创建用于绘制该线的UIView方法

- (UIView*)hLineSeperator { 
     if (!_hLineSeperator) { 
      _hLineSeperator = [UIView new]; 
      _hLineSeperator.translatesAutoresizingMaskIntoConstraints = NO; 
      _hLineSeperator.backgroundColor = [UIColor grayColor]; 
     } 
     return _hLineSeperator; 
    } 
+0

该行可能在某处。我没有看到任何代码涉及设置hLiveSeperator的框架,尝试设置框架layoutSubviews? – joels

+0

据我所知,如果我设置框架,那么我不再使用自动布局。也许我错了这个假设。限制和自动布局框架不使用。 – CroSensation

+0

发现我的错误,就像我认为这是一个小疏忽......而不是“H:| [_hLineSeperator(1)] |” “V:| -vTop - [_ userName] -vMiddle - [_ email] -vMiddle - [_ hLineSeperator(1)] - vMiddle - [_ navigationContainer] |”。无论如何,我会留下它,以防其帮助某人。 – CroSensation

回答

0

不需要为代码中创建的子视图添加约束条件(特别是您想要创建的)。你可以做到这一点像,

UIView *horizontalSeperatorViewOnTop = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.(yourView).frame.size.width, 0.5f)]; 
horizontalSeperatorViewTop.backgroundColor = [UIColor lightGrayColor]; 
[self.(yourView) addSubview: horizontalSeperatorViewOnTop]; 

我的水平或垂直分隔符做到这一点在我的代码所有的时间和它的伟大工程!

+1

当然,如果您使用框架但不适用于自动布局,则此功能非常有用。 – CroSensation