2014-10-04 3 views
0

Я сделал небольшую демонстрацию, чтобы показать, что происходит в моем приложении. В принципе, я хочу анимировать UIView в левом верхнем углу, который занимает половину ширины экрана, чтобы занять всю ширину и «нажимать» UIView в правом верхнем углу экрана. Затем, в более поздней анимации, я хочу вернуть UIView на экран и изменить размер изображения слева на половину ширины экрана, который начинается.Изменение ширины UIView с Autolayout

Я сделал несколько скриншотов, чтобы продемонстрировать, что происходит с тем, как у меня есть сейчас. Вот как она начинается: This is how it starts out on launch Затем после изменения размера вида слева This is after enlarging the left UIView После попытки вернуть его This is after trying to bring it back to half size А вот код, который изменяет размер взглядов

- (void)replaceWidthConstraintOnView:(UIView *)view withConstant:(float)constant { 

    [self.view.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) { 
     if ((constraint.firstItem == view) && (constraint.firstAttribute == NSLayoutAttributeWidth)) { 
      constraint.constant = constant; 
     } 
    }]; 
} 

- (IBAction)changeViewSize { 


    CGFloat blueViewWidth = self.blueView.bounds.size.width; 

    if (blueViewWidth == self.view.bounds.size.width) { 

     blueViewWidth = blueViewWidth/2; 
     [self replaceWidthConstraintOnView:self.blueView withConstant:blueViewWidth]; 

    } 
    else { 
     blueViewWidth = blueViewWidth * 2; 
     [self replaceWidthConstraintOnView:self.blueView withConstant:blueViewWidth]; 
    } 
} 

Я удивляясь, почему синий вид не возвращается, чтобы покрыть только половину экрана. Я ценю любую помощь!

+0

Вы можете попробовать следующее: После установки новой ширины по constraint.constant = постоянным; insert [containerView layoutIfNeeded]; где containerView - это вид вашего синего экрана. –

ответ

1

Я не уверен, почему он не работает так, как вы его написали, но вы можете использовать некоторые относительные ограничения вместо размеров float.

Прежде всего, убедитесь, что вы устанавливаете для свойства translatesAutoresizingMaskIntoConstraints значение NO на синем изображении.

Нечто подобное будет сделать Blue View половину размера главного вида:

[self.view addConstraint:[NSLayoutConstraint 
        constraintWithItem:self.blueView 
        attribute:NSLayoutAttributeWidth 
        relatedBy:NSLayoutRelationEqual 
        toItem:self.view 
        attribute:NSLayoutAttributeWidth 
        multiplier:0.5f 
        constant: 0.0]]; 

Чтобы сделать, если заполнить весь вид вы можете перебрать все ограничения и изменять множители/константы, как вы хотите. Это, к примеру, сделать синий вид заполнить его родитель, установив множитель для NSLayoutAttributeWidth ограничить до 1,0:

for(NSLayoutConstraint *constraint in self.view.constraints) 
{ 
    if(constraint.firstAttribute == NSLayoutAttributeWidth && constraint.secondAttribute == NSLayoutAttributeWidth && 
     constraint.firstItem == self.blueView && constraint.secondItem == self.blueView) 
    { 
     constraint.multiplier = 1.0; 
    } 
} 
+0

Это золото. Спасибо! – Idan

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