2015-04-30 88 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