• NSLayoutConstraint


    屏幕兼容的问题

    为了让我们的应用在不容尺寸的屏幕下都能 “正常”的表示,我们尽量不要把数据写死。

    大多数可视元素都是一个矩形区域,当然这个矩形区域有坐标的,我们有了这个区域坐标就能确定可视元素的现实位置了。

    但是iphone5 和以前的屏幕不一样了,在以前的设备中,我们可以添加一个 xx.@2x.png 来适应retina屏幕,但是iphoen5咋办呢?

    ios 引入了 Auto Layout 的东东,这个要和UIViewAutoresizing 区分下。

    看下面代码

    - (void)viewDidLoad
    {
        [super viewDidLoad];
            
        UIView *aView = [[UIView alloc] init];
        aView.backgroundColor = [UIColor redColor];

    //为了不和autosizing冲突,我们设置No

        [aView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.view addSubview:aView];
        
        UIView *bView = [[UIView alloc] init];
        bView.backgroundColor = [UIColor blueColor];
        [bView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.view addSubview:bView];
        
        NSDictionary *views = NSDictionaryOfVariableBindings(aView, bView);

    //NSDictionaryOfVariableBindings  宏  其实 NSDictionaryOfVariableBindings(v1, v2, v3) 等效于 [NSDictionary dictionaryWithObjectsAndKeys:v1, @"v1", v2, @"v2", v3, @"v3", nil];    
        [self.view addConstraints:
        [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=50)-[aView(100)]"
                                                 options:0
                                                 metrics:nil
                                                   views:views]];
        
        [self.view addConstraints:
         [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=100)-[aView(50)]"
                                                 options:0
                                                 metrics:nil
                                                   views:views]];
       
        [self.view addConstraints:
         [NSLayoutConstraint constraintsWithVisualFormat:@"H:[bView(==aView)]"
                                                 options:0
                                                 metrics:nil
                                                   views:views]];
        [self.view addConstraints:
         [NSLayoutConstraint constraintsWithVisualFormat:@"V:[bView(==aView)]"
                                                 options:0
                                                 metrics:nil
                                                   views:views]];
        
        [self.view addConstraint:
         [NSLayoutConstraint constraintWithItem:bView
                                      attribute:NSLayoutAttributeLeft
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:aView
                                      attribute:NSLayoutAttributeRight
                                     multiplier:1
                                       constant:10]];
        //添加一个限制  等效于 bView.frame.origin.x  = (aView.frame.origin.x +aView.frame.size.width)  * 1  + 10,好像是这样的!个人觉得!

      它是一种依赖关系,bView依赖aView,这样就算aView变了,bView也会跟着变换。
        [self.view addConstraint:
         [NSLayoutConstraint constraintWithItem:bView
                                      attribute:NSLayoutAttributeTop
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:aView
                                      attribute:NSLayoutAttributeTop
                                     multiplier:1
                                       constant:0]];
        
        [aView release];
        [bView release];
    }

    constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:

    Create a constraint of the form "view1.attr1 <relation> view2.attr2 * multiplier + constant".

    属性

    typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
        NSLayoutAttributeLeft = 1,
        NSLayoutAttributeRight,
        NSLayoutAttributeTop,
        NSLayoutAttributeBottom,
        NSLayoutAttributeLeading,
        NSLayoutAttributeTrailing,
        NSLayoutAttributeWidth,
        NSLayoutAttributeHeight,
        NSLayoutAttributeCenterX,
        NSLayoutAttributeCenterY,
        NSLayoutAttributeBaseline,
        
        NSLayoutAttributeNotAnAttribute = 0
    };

    关系

    typedef NS_ENUM(NSInteger, NSLayoutRelation) {
        NSLayoutRelationLessThanOrEqual = -1,
        NSLayoutRelationEqual = 0,
        NSLayoutRelationGreaterThanOrEqual = 1,
    };

    最后的结果就是 “view1.attr1  <       >=    或者 ==   或者    <=       >  view2.attr2 * multiplier + constant

  • 相关阅读:
    数据库面试题
    数据库面试题
    DevExpress GridView 鼠标悬停颜色追踪(行或单元格)
    DevExpress GridView 鼠标悬停颜色追踪(行或单元格)
    2015最新最全最详细的配置win8.1开启IIS和ASP
    2015最新最全最详细的配置win8.1开启IIS和ASP
    打开IIS管理器命令cmd
    打开IIS管理器命令cmd
    C#在方法或属性中使用sealed时的操作与原理
    C#在方法或属性中使用sealed时的操作与原理
  • 原文地址:https://www.cnblogs.com/DamonTang/p/3570743.html
Copyright © 2020-2023  润新知