2014-11-17 3 views
2

У меня есть две точки зрения, как это:Ограничения не работает, как я ожидал

enter image description here

I установки вертикальные пространственные ограничения:

enter image description here

Как вы видите, ограничение между нижней частью BottomView и нижней частью TopView является 0. Но, к сожалению, это не так, когда я нажимаю кнопку Toggle, чтобы переместить верхний вид. Вот код:

@IBAction func onToggle(sender: AnyObject) { 

    self.topView.transform = CGAffineTransformMakeTranslation(0, -self.topView.bounds.height) 
} 

Это то же самое, даже если я добавлю:

self.view.setNeedsUpdateConstraints() 
    self.view.setNeedsLayout() 

Результат:

enter image description here

Очевидно, разница между дном Topview и верхней BottomView в не 0. Автомакет не работает. Я что-то пропустил? Thanks

P.S.: Я знаю, что есть другой способ решить эту проблему. Например, чтобы изменить кадр BottomView при нажатии переключателя. Но мой вопрос заключается в том, почему автозапуск не работает, как я ожидаю?

ответ

1

Я думаю, возможно, связано с ограничением TopView. Рамка TopView изменилась, когда вы применяете преобразование трансляции к верхнему виду. Так что его верхнее ограничение поля тоже изменилось. Это повлияет на ограничение верхнего края нижнего представления.

Мое предложение не применяет преобразование перевода для UIView.Вместо этого измените верхнее ограничение вертикального пространства верхнего вида.

self.topConstraint.constant = -self.topView.bounds.height 

Вид снизу будет следующим образом сверху. Это означает, что автозапуск действительно работает. Надеюсь, это поможет.

+0

Спасибо. Оно работает. Ваш ответ имеет смысл. –

0

Преобразования в представления применяются после того, как остальная часть кода компоновки завершена. Это включает в себя автоматическую компоновку, поэтому, если вы измените преобразование вида, это не повлияет на автоматическую компоновку. Преобразование будет относиться к тому месту, где автоматическая компоновка разместила представление.

1

Похоже, что у iOS 8 есть ошибка с изменением размера UILabel.

Во всяком случае, предполагая, что ваши две точки зрения не являются UILabels, метод я предлагаю использовать это создать свойство, которое запоминает ограничение высоты для вида сверху:

@interface ViewController : UIViewController 

@property (nonatomic, strong) UIView *topView; 
@property (nonatomic, strong) UIView *bottomView; 

// ----------------------------------------------------------- 
// We will animate this NSLayoutConstraint's constant value 
// ----------------------------------------------------------- 
@property (nonatomic, strong) NSLayoutConstraint *topViewHeightConstraint; 

@end 

Then установки наших взглядов и кнопку переключения:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    [self initViews]; 
    [self initConstraints]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(void)initViews 
{ 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
    self.navigationController.navigationBar.translucent = NO; 

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Toggle" style:UIBarButtonItemStylePlain target:self action:@selector(toggleTopView)]; 

    self.topView = [[UIView alloc] init]; 
    self.topView.backgroundColor = [UIColor colorWithRed:203.0/255.0 green:89.0/255.0 blue:91.0/255.0 alpha:1.0]; 

    self.bottomView = [[UIView alloc] init]; 
    self.bottomView.backgroundColor = [UIColor colorWithRed:103.0/255.0 green:167.0/255.0 blue:187.0/255.0 alpha:1.0]; 

    [self.view addSubview:self.topView]; 
    [self.view addSubview:self.bottomView]; 
} 

-(void)initConstraints 
{ 
    self.topView.translatesAutoresizingMaskIntoConstraints = NO; 
    self.bottomView.translatesAutoresizingMaskIntoConstraints = NO; 

    self.topView.layoutMargins = UIEdgeInsetsZero; 
    self.bottomView.layoutMargins = UIEdgeInsetsZero; 

    id views = @{ 
       @"topView": self.topView, 
       @"bottomView": self.bottomView 
       }; 

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

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


    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topView][bottomView]|" options:0 metrics:nil views:views]]; 

    self.topViewHeightConstraint = [NSLayoutConstraint constraintWithItem:self.topView 
                   attribute:NSLayoutAttributeHeight 
                   relatedBy:NSLayoutRelationEqual toItem:nil 
                   attribute:NSLayoutAttributeHeight 
                   multiplier:1.0 constant:170.0]; 

    [self.view addConstraint:self.topViewHeightConstraint]; 
} 

-(void)toggleTopView 
{ 
    if(self.topViewHeightConstraint.constant != 0) 
    { 
     self.topViewHeightConstraint.constant = 0; 
    } 
    else 
    { 
     self.topViewHeightConstraint.constant = 170.0; 
    } 

    [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{ 

     [self.view layoutIfNeeded]; 

    } completion:nil]; 


} 

Вы получаете это на первый:

screenshot 1

Затем при нажатии на кнопке переключения, мы устанавливаем свойство heightConstraint константы быть 0:

-(void)toggleTopView 
{ 
    if(self.topViewHeightConstraint.constant != 0) 
    { 
     self.topViewHeightConstraint.constant = 0; 
    } 
    else 
    { 
     self.topViewHeightConstraint.constant = 170.0; 
    } 

    [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{ 

     [self.view layoutIfNeeded]; 

    } completion:nil]; 
} 

вы получаете гладкую сворачивающуюся анимацию красный:

screenshot 2

+0

Спасибо. Я использую тот же метод для создания анимации. –

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