2015-01-17 1 views
0

Я пытаюсь провести горизонтальную линию через середину экрана приложения с панелью навигации. Вот мой текущий код, чтобы сделать это:Objective-C - рисование горизонтальной линии через середину экрана

CGFloat screenWidth = self.view.frame.size.width; 
CGFloat screenHeight = self.view.frame.size.height; 
CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height; 
CGFloat lineThickness = 3; 

UIView *horizontalLine = [[UIView alloc] initWithFrame:CGRectMake(0, (screenHeight - navigationBarHeight)/2, screenWidth, lineThickness)]; 
[self.view addSubview:horizontalLine]; 

Я использовал очень похожий расчет, чтобы нарисовать вертикальную линию - и это работало нормально. Но проблема в том, что независимо от устройства эта горизонтальная линия оказывается слишком низкой на экране примерно на 10 пикселей. Есть ли смещение, которое я могу потерять? Возможно, что-то связано с навигационной панелью?

+1

Вы имеете в виду высоту строки состояния? – Wain

+0

Я имею в виду навигационную панель, которая поступает с помощью навигационного контроллера –

ответ

1

ОК, я сделал это, как это первый .. но он не был центрирован. но это ДОЛЖНО БЫТЬ! :) Под этим я изменил его, чтобы добавить представление, чтобы обернуть его все, и это, казалось, «работало» , вы можете попробовать либо или, либо комбинацию некоторых элементов и посмотреть, как это происходит.

UIView *horizontalLine = [[UIView alloc] initWithFrame:CGRectZero]; 

[self.view addSubview:horizontalLine]; 

[horizontalLine setTranslatesAutoresizingMaskIntoConstraints: NO]; 

horizontalLine.backgroundColor = [UIColor blackColor]; 

id topGuide = self.topLayoutGuide; 
id bottomGuide = self.bottomLayoutGuide; 

NSDictionary * viewsDictionary = NSDictionaryOfVariableBindings(horizontalLine, topGuide, bottomGuide); 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[horizontalLine]|" options:0 metrics: 0 views:viewsDictionary]]; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topGuide][horizontalLine(==3)][bottomGuide]|" options:0 metrics: 0 views:viewsDictionary]]; 


[self.view addConstraint: 
[NSLayoutConstraint constraintWithItem:horizontalLine 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
           toItem:self.view 
           attribute:NSLayoutAttributeCenterY 
          multiplier:1 
           constant:0]]; 

«завернутый» подход. это немного грязный, но это может дать вам некоторые идеи вещей, чтобы попытаться

UIView * wrapper = [[UIView alloc] initWithFrame:CGRectZero]; 

UIView *horizontalLine = [[UIView alloc] initWithFrame:CGRectZero]; 

[wrapper setTranslatesAutoresizingMaskIntoConstraints: NO]; 
[horizontalLine setTranslatesAutoresizingMaskIntoConstraints: NO]; 

[self.view addSubview:wrapper]; 
[wrapper addSubview:horizontalLine]; 

horizontalLine.backgroundColor = [UIColor blackColor]; 

id topGuide = self.topLayoutGuide; 
id bottomGuide = self.bottomLayoutGuide; 

NSDictionary * viewsDictionary = NSDictionaryOfVariableBindings(horizontalLine, topGuide, bottomGuide, wrapper); 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[wrapper]|" options:0 metrics: 0 views:viewsDictionary]]; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topGuide][wrapper][bottomGuide]|" options:0 metrics: 0 views:viewsDictionary]]; 

[wrapper addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[horizontalLine]|" options:0 metrics: 0 views:viewsDictionary]]; 

[wrapper addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=1)-[horizontalLine(==3)]-(>=1)-|" options:0 metrics: 0 views:viewsDictionary]]; 

[wrapper addConstraint: 
[NSLayoutConstraint constraintWithItem:horizontalLine 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
           toItem:wrapper 
           attribute:NSLayoutAttributeCenterY 
          multiplier:1 
           constant:0]]; 
+0

, который первым работал просто отлично - удивительно –

0

Ну, я как @ myte, решение которого. Если я сделаю ту же самую функцию, я также буду использовать NSLayoutConstraint. Однако, чтобы ответить на ваш вопрос напрямую, то, что вам не хватает, это строка состояния. Строка состояния обычно составляет 20 пикселей по высоте. Когда вы разделите это на 2, вы получите ровно 10 пикселей.

CGFloat screenWidth = self.view.frame.size.width; 
CGFloat screenHeight = self.view.frame.size.height; 
CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height; 
CGFloat lineThickness = 3; 

// This is what you are missing 
CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; 

UIView *horizontalLine = [[UIView alloc] initWithFrame:CGRectMake(0, (screenHeight - navigationBarHeight - statusBarHeight)/2, screenWidth, lineThickness)]; 
[self.view addSubview:horizontalLine]; 

PS: Вы упомянули, что проблема «независимо от устройства», однако, если вы попробуете его на iPhone 4S в ландшафтном режиме, он может просто быть сосредоточены все хорошо, потому что строка состояния скрыта: P (link).

Смежные вопросы