2014-02-03 2 views
1

В моем представлении у контроллера есть два объекта. TopView и CustomScrollView. Я хотел бы позиционировать Topview сверху и CustomScrollView под ними, так что я положил это:Перемещение UIView в среде автоматического макета

// TOP VIEW LAYOUT 

// horizontal 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:| [_topView]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_topView, self)]]; 
// vertical 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_topView(89)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_topView, self)]]; 


// CUSTOMSCROLLVIEW 

// horizontal 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_customScrollVeiw]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_customScrollVeiw, self)]]; 
// vertical 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_topView]-(0)-[_customScrollVeiw]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_customScrollVeiw, _topView, self)]]; 

и работает отлично.

Но сейчас я хотел бы перейти Вид сверху, как я прокручиваю в CustomScrollView так я создаю эту функцию:

- (void) moveOnScroll: (CGPoint) offset contentSize: (CGSize) contentSize 
{ 
float delta = offset.y - self.yPosition; 
if (self.yPosition > offset.y) { 
    if (labs(self.frame.origin.y) < self.frame.size.height/50){ 
     self.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
    } 

    else if (self.frame.origin.y - delta < 0 && offset.y < (contentSize.height - self.screenHeight)){ 
     self.frame = CGRectMake(0, self.frame.origin.y - delta, self.frame.size.width, self.frame.size.height); 
    } 
    else{ 
     self.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
    } 
} 
else { 
    if (self.frame.origin.y > (- self.frame.size.height + self.labelHeight) && offset.y > 0){ 

     if (self.frame.origin.y - delta < (- self.frame.size.height + self.labelHeight)) { 
      self.frame = CGRectMake(0, (- self.frame.size.height + self.labelHeight), self.frame.size.width, self.frame.size.height); 
     } 
     else{ 
      self.frame = CGRectMake(0, self.frame.origin.y - delta , self.frame.size.width, self.frame.size.height); 
     } 
    } 
} 
self.yPosition = offset.y; 
} 

Теперь TopView скрывается, как я прокручивать, но CustomScrollView не обниматься к TopView больше, его остается на своем месте и не двигается. (V: [_ topView] - (0) - [_ customScrollVeiw] |)

как исправить это?

+1

Используйте это: https://github.com/iMartinKiss/KeepLayout это сделает вашу жизнь проще о AutoLayout – AncAinu

+1

А насчет вашего вопроса, один раз вы используете AutoLayout, вы не должны касаться фреймов напрямую, если вы не хотите все испортить – AncAinu

+0

Да, я думал, что это может быть проблемой. Но как изменить свойство Y без изменения рамки с автоматической компоновкой. –

ответ

1

Сохранить это ограничение где-то в вашем контроллере представления

// vertical 
NSArray *topViewContstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_topView(89)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_topView, self)] 
for (NSLayoutConstraint *constraint in topViewContstraints) { 
    if (constraint.firstAttribute == NSLayoutAttributeHeight) { 
     _topViewConstraint = constraint; 
     break; 
    } 
} 
[self.view addConstraints:topViewContstraints]; 

затем изменить у позиции сверху с помощью сохраненного ограничения:

_topViewConstraint.constant = yOffset; 

где YOffset это рассчитанное значение в пользовательском методе.

О, и вы хотите, чтобы оживить это изменения:

[UIView animateWithDuration:0.3 animations:^{ 
     [_topView layoutIfNeeded]; 
}]; 
+0

[Ограничения NSLayoutConstraintWithVisualFormat: @" V: | [_topView (89)] "- это массив ограничений. Могу ли я изменить константу массива? –

+0

Проверьте, есть ли только одно ограничение в массиве или нет, если один - получить и отредактировать его, если нет, я отредактирую свой ответ =) – Ossir

+0

Да было два элемента. Первый обнимал верх, а вторая - особая высота. Единственная ошибка в том, что я должен положить -yOffset: D Большое спасибо. –

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