自动布局以编程方式导致 iphone 4 出现问题

Posted

技术标签:

【中文标题】自动布局以编程方式导致 iphone 4 出现问题【英文标题】:AutoLayout programmatically cause issue in iphone 4 【发布时间】:2015-07-18 05:57:15 【问题描述】:

我正在通过代码学习自动布局。为了我的学习目的,我正在使用自动布局做示例应用程序。在我的示例应用程序中,我决定将文本字段保持在距上边距 20 点以下。这是代码

#import "SampleViewController.h"
@interface SampleViewController ()
UITextField *username;

@end
@implementation SampleViewController

- (void)viewDidLoad 
[super viewDidLoad];
 self.edgesForExtendedLayout = UIRectEdgeNone;
[self prepareViews];


-(void)prepareViews
   username = [[UITextField alloc]init];
   username.placeholder = @"Username";
   [username setBorderStyle:UITextBorderStyleRoundedRect];
   username.translatesAutoresizingMaskIntoConstraints = NO;

   [self.view addSubview:username];
   [self prepareConstraint];

-(void)prepareConstraint
   NSLayoutConstraint *constraint = [NSLayoutConstraint
                      constraintWithItem:username
                      attribute:NSLayoutAttributeCenterX
                      relatedBy:NSLayoutRelationEqual
                      toItem:self.view
                      attribute:NSLayoutAttributeCenterX
                      multiplier:1.0
                      constant:0];
    [self.view addConstraint:constraint];

         constraint = [NSLayoutConstraint
                      constraintWithItem:username
                      attribute:NSLayoutAttributeWidth
                      relatedBy:NSLayoutRelationEqual
                      toItem:nil
                      attribute:NSLayoutAttributeNotAnAttribute
                      multiplier:1.0
                      constant:250];
    [self.view addConstraint:constraint];

         constraint = [NSLayoutConstraint
                      constraintWithItem:username
                      attribute:NSLayoutAttributeTopMargin
                      relatedBy:NSLayoutRelationEqual
                      toItem:self.view
                      attribute:NSLayoutAttributeTopMargin
                      multiplier:1.0
                      constant:20];
    [self.view addConstraint:constraint];
   
   @end

当我在 iphone 4(ios 7.1) 上运行此代码时,我得到了这样的输出 然后,当我在 iphone 5S(iOS 8.4)上运行此代码时,我得到了这样的输出

伙计们,我不知道我在哪里犯了错误。请指出我在哪里犯了错误。当我在 iphone 4 (iOS 7.1) 上运行此代码时,我收到了这个警告。

无法同时满足约束。可能至少有一个 以下列表中的约束是您不想要的。尝试 这个:(1)查看每个约束并尝试找出你 不要期待; (2) 找到添加了不需要的约束的代码或 约束并修复它。 (注:如果你看到 NSAutoresizingMaskLayoutConstraints 你不明白的,参考 到 UIView 属性的文档 translatesAutoresizingMaskIntoConstraints) ( "<0x14dcac70 h:>

<0x14dcac70 h:>

【参考方案1】:

这是在 4s 和 5s 中测试的......你只需将宽度约束添加到视图而不是你应该将它应用到文本字段......

NSLayoutConstraint *constraint = [NSLayoutConstraint
                                  constraintWithItem:username
                                  attribute:NSLayoutAttributeCenterX
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:self.view
                                  attribute:NSLayoutAttributeCenterX
                                  multiplier:1.0
                                  constant:0];
[self.view addConstraint:constraint];

constraint = [NSLayoutConstraint
              constraintWithItem:username
              attribute:NSLayoutAttributeWidth
              relatedBy:NSLayoutRelationEqual
              toItem:nil
              attribute:NSLayoutAttributeNotAnAttribute
              multiplier:1.0
              constant:250];
[username addConstraint:constraint];

constraint = [NSLayoutConstraint
              constraintWithItem:username
              attribute:NSLayoutAttributeTopMargin
              relatedBy:NSLayoutRelationEqual
              toItem:self.topLayoutGuide
              attribute:NSLayoutAttributeBottom
              multiplier:1.0
              constant:20];
[self.view addConstraint:constraint];

【讨论】:

以上是关于自动布局以编程方式导致 iphone 4 出现问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS 以编程方式生成的视图具有隐藏的约束,导致与自动布局发生冲突

如何使用按钮动画实现自动布局

滚动视图错误以编程方式自动布局

以编程方式使用布局锚点的自动布局不起作用

以编程方式使用自动布局的 UITableviewcell 中相同内容的动态高度

基于在 Storyboard 中使用自动布局创建的另一个视图,以编程方式使用框架创建视图