2015-03-27 2 views
0

У меня есть позиция UIImageView, зависящая от iAdBanner. Я получаю ошибку:LayoutConstraint error при программной настройке динамического uiimageview

"<NSLayoutConstraint:0x17409eb40 UIImageView:0x1741e9200.bottom == UIView:0x17418d270.bottom - 100>", 
"<NSLayoutConstraint:0x174281e00 UIImageView:0x1741e9200.bottom == UIView:0x17418d270.bottom - 50>" 

Любые идеи о том, что вызывает это? Ниже приведен код для установки uiimageview и в зависимости от того, загружается ли iAd или нет, устанавливается высота.

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sunshine.png"]]; 
    CGRect frame = imgView.frame; 
    frame.size.width = 180; 
    frame.size.height = 30; 
    imgView.frame = frame; 
    imgView.translatesAutoresizingMaskIntoConstraints = NO; 

    [imgView setContentMode:UIViewContentModeScaleAspectFit]; 
    [imgView sizeToFit]; 
    [self.view addSubview:imgView]; 

    [self.view addConstraint:[NSLayoutConstraint 
           constraintWithItem:imgView 
           attribute:NSLayoutAttributeTrailing 
           relatedBy:NSLayoutRelationEqual 
           toItem:self.view 
           attribute:NSLayoutAttributeTrailing 
           multiplier:1.0 
           constant:6.0]]; 
    _imgView = imgView; 

} 

-(void)bannerViewDidLoadAd:(ADBannerView *)banner { 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [banner setAlpha:1]; 
    [UIView commitAnimations]; 

     [self.view addConstraint:[NSLayoutConstraint 
            constraintWithItem:_imgView 
            attribute:NSLayoutAttributeBottom 
            relatedBy:NSLayoutRelationEqual 
            toItem:self.view 
            attribute:NSLayoutAttributeBottom 
            multiplier:1.0 
            constant:-100.0]]; 

} 

-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error { 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [banner setAlpha:0]; 
    [UIView commitAnimations]; 

     [self.view addConstraint:[NSLayoutConstraint 
            constraintWithItem:_imgView 
            attribute:NSLayoutAttributeBottom 
            relatedBy:NSLayoutRelationEqual 
            toItem:self.view 
            attribute:NSLayoutAttributeBottom 
            multiplier:1.0 
            constant:-50.0]]; 
} 
+1

Показать ограничения и журнал ошибок. Это поможет нам больше. – Jassi

+0

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

ответ

0

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

+0

Ошибка в нижней части uiimageview и нижней части uiview, которая не имеет ограничений, которые я вижу в раскадровке. Любое другое место, куда я должен смотреть? – user3411663

0

Определенно звучит для меня, как два из ваших ограничений противоречат друг другу. Не могли бы вы поделиться еще одним кодом или скриншотом своей раскадровки? Я бы хотел, чтобы все ваши синие были синими.

0

Проблема заключается в том, что вы добавляете нижние ограничения 2 раза, один раз в -(void)bannerViewDidLoadAd:(ADBannerView *)banner и один раз в (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error методах. Ограничения имеют разные постоянные значения (-100 и -50), поэтому они сбой.

Правильный способ сделать это - добавить ограничение только один раз, а затем в 2 метода изменить его значение.

Что-то вроде этого:

В первом способе, в котором вы добавляете косое ограничение, а также добавить нижнее ограничение один и сохранить ссылку на него:

self.bottomOffsetConstraint = [NSLayoutConstraint 
            constraintWithItem:_imgView 
            attribute:NSLayoutAttributeBottom 
            relatedBy:NSLayoutRelationEqual 
            toItem:self.view 
            attribute:NSLayoutAttributeBottom 
            multiplier:1.0 
            constant:-100.0]; 
[self.view addConstraint:self.bottomOffsetConstraint]; 

Тогда в 2-х методах, которые вы изменить константа:

-(void)bannerViewDidLoadAd:(ADBannerView *)banner { 
    [self.bottomOffsetConstraint setConstant:-50]; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [banner setAlpha:1]; 
    // You need to call this in the animation block to trigger the constraints update 
    [self.view layoutIfNeeded]; 
    [UIView commitAnimations]; 
} 

-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error { 

    [self.bottomOffsetConstraint setConstant:-50]; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [banner setAlpha:0]; 
    [self.view layoutIfNeeded]; 
    [UIView commitAnimations]; 
} 

Это исправит ограничения на сбой и будет анимировать изменения компоновки.

Дайте мне знать, как все идет!

+0

Тот же отчет о сбоях, вы имели в виду, чтобы положить -100 в viewDidLoadAd? Когда появляется баннер iAd, изображение не перемещается. Дайте мне знать, если я могу предоставить больше кода ... – user3411663

+0

Хм .. этого не должно быть. Не могли бы вы показать мне, в каком методе вы добавляете ограничение? Какое значение должно иметь ограничение при запуске приложения? –

+0

Должно быть -50 (нижнее положение), когда оно начинается, и оно находится в viewWillAppear. Мои оригинальные номера были извините за путаницу. Теперь он начинается в правильном положении (ниже), появляется яд, и он поднимается вверх (хорошо!). Если я перейду к виду, изображение будет в верхнем и нижнем положениях. нижний перемещается в верхний. – user3411663

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