使用autolayout的NSLayoutConstraint类中的constraintWithItem 、constraintsWithVisualFormat这两个类方法来创建视图并可以实现自动布局

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self createViewWithConstraintItem];
    [self createViewWithConstraint];
}

- (void)createViewWithConstraintItem
{
    UIView *redView = [[UIView alloc]init];
    redView.backgroundColor=[UIColor redColor];
    redView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:redView];

    /**左边距50*/
    NSLayoutConstraint *viewLeftConstraint = [NSLayoutConstraint constraintWithItem:redView
                                                            attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view
                                                            attribute:NSLayoutAttributeLeading multiplier:1 constant:50.f];
    /**上边距50*/
    NSLayoutConstraint *viewTopConstraint = [NSLayoutConstraint constraintWithItem:redView
                                                    attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view
                                                            attribute:NSLayoutAttributeTop multiplier:1 constant:100.f];

    /*--------------------------------------------------------------------------------
     注意:通常在设置宽度高度的时候最好不要固定死,另外当viw1.attribute不等于view2.attribute*multiplier
     +constant的时候,我们则要constraintWithItem函数中的toItem设置为nil以及attribute参数设置
     为NSLayoutAttributeNotAnAttribute
     ---------------------------------------------------------------------------------*/
    /**宽度150*/
    NSLayoutConstraint *viewWidthConstaint = [NSLayoutConstraint constraintWithItem:redView
                                                            attribute:NSLayoutAttributeWidth
                                                    relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                            toItem:nil
                                                        attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:150];
    /**高度150*/
    NSLayoutConstraint *viewHeightConstaint = [NSLayoutConstraint constraintWithItem:redView
                                                                attribute:NSLayoutAttributeHeight
                                                    relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                                toItem:nil
                                                        attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:150];

    [self.view addConstraints:@[viewLeftConstraint,viewTopConstraint,viewWidthConstaint,viewHeightConstaint]];
}

- (void)createViewWithConstraint
{
    /**创建左边view*/
    UIView *leftView = [[UIView alloc]init];
    leftView.backgroundColor = [UIColor redColor];
    leftView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:leftView];

    /**创建右边view*/
    UIView *rightView = [[UIView alloc]init];
    rightView.backgroundColor = [UIColor blueColor];
    rightView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:rightView];

    /**创建右下方view*/
    UIView *rightBottomView = [[UIView alloc]init];
    rightBottomView.backgroundColor = [UIColor yellowColor];
    rightBottomView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:rightBottomView];

    NSDictionary *viewDic = NSDictionaryOfVariableBindings(leftView,rightView,rightBottomView);

    /*距父视图左边距50以及自身宽度大于等于150*/
    NSArray *leftView_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[leftView(>=150)]" options:0 metrics:nil views:viewDic];

    /*距父视图上边距100以及自身高度大于等于150*/
     NSArray *leftView_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[leftView(>=150)]" options:0 metrics:nil views:viewDic];

    /*水平方向布局,rightView 在 leftView 右侧标准距离处,并且宽度不小于 50 点。*/
    NSArray *rightView_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[leftView]-[rightView(>=50)]" options:0 metrics:nil views:viewDic];

    NSArray *rightView_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[rightView(>=50)]" options:0 metrics:nil views:viewDic];

    NSArray *rightBottomView_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[leftView]-[rightBottomView(>=50)]" options:0 metrics:nil views:viewDic];

    /*垂直方向布局距离父视图100,另外rightBottomView 在 rightView下方也就是相当于紧贴*/
    NSArray *rightBottomView_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-100-[rightView(>=50)][rightBottomView(>=100)]" options:0 metrics:nil views:viewDic];

    [self.view addConstraints:leftView_H];
    [self.view addConstraints:leftView_V];

    [self.view addConstraints:rightView_H];
    [self.view addConstraints:rightView_V];

    [self.view addConstraints:rightBottomView_H];
    [self.view addConstraints:rightBottomView_V];

}

@end

时间: 2025-01-16 09:56:50

使用autolayout的NSLayoutConstraint类中的constraintWithItem 、constraintsWithVisualFormat这两个类方法来创建视图并可以实现自动布局的相关文章

能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么

不能向编译后得到的类中增加实例变量!能向运行时创建的类中添加实例变量! 因为编译后的类已经注册在runtime中,类结构体中的objc_ivar_list 实例变量的链表和instance_size实例变量的内存大小已经确定,同时runtime 会调用class_setIvarLayout 或 class_setWeakIvarLayout来处理strong weak引用,所以不能向存在的类中添加实例变量. 运行时创建的类是可以添加实例变量,调用 class_addIvar 函数,但是得在调用 

iOS中的initialize与load两个类方法简单理解

如果你在一个UIViewController中重写了这两个类方法,那么你会在在这个控制器中发现一下现象: 1,相同之处: (1)这两个类方法在init之前就调用了 (2)在整个应用app中无论你用到这个类多少次,这两个类方法均只会被调用一次 2,不同之处: (1)load是在initialize之前被调用 (2)更特别的是,如果你没有用到你重写的这个控制器.那你重写的load类方法也会调用.换句话说,这个load方法是在didFinishLaunchingWithOptions方法之前就被调用了

BUG::Cocos V3.2 渲染类中为什么出现同样的两次排序,难道有什么不同吗?手误??----小心开源代码中的陷阱

{ // Don't sort _queue0, it already comes sorted std::sort(std::begin(_queueNegZ), std::end(_queueNegZ), compareRenderCommand); std::sort(std::begin(_queuePosZ), std::end(_queuePosZ), compareRenderCommand); } // helper static bool compareRenderComman

面向对象中对象和类以及如何访问类中属性和方法

对象:客观存在的具体事物.某一个具体的个体 *类:具有相同行为和共同特征的对象的集合,类是人类脑海中一个抽象的概念,通过类创建对象 *类中的成员:1.成员属性(描述外部特征) 2.成员方法(描述功能行为)* 如何定义一个类: * [修饰符] class 类名{ * //1.属性的定义:与定义变量类似 * [修饰符] 数据类型 属性名; * //2.方法的定义 * [修饰符] 返回值类型 方法名(形参列表){ * //方法体; * } * } * 成员变量和局部变量的区别: * 1.作用域不同:成

Java中自定义对象使用Collections工具类中的Sort方法

Collections工具类中的sort方法有两种形式: (1) sort(List<T> list) (2) sort(List<T> list, Comparator<? super T> c) 第一种方法中List类型的对象必须实现Comparable接口,此外,List中的元素必须可比较. 我们先定义类 package com.dongye.sort; import java.util.ArrayList; import java.util.Collection

类中为什么要定义__init__()方法

总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. class Rectangle(): def getPeri(self,a,b): return (a + b)*2 def getArea(self,a,b): return a*b rect = Rectangle() prin

转:python学习——类中为什么要定义__init__()方法

学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类定义一个矩形的类,目的是求周长和面积. 1 class Rectangle(): 2 def getPeri(self,a,b): 3 return (a + b)*2 4 def getArea(self,a,b): 5 return a*b 6 7 rect = Rectangle() 8 print(rect.getPeri(3,4)) 9 print(rect.

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

检测某个方法是否属于某个类中--解析php函数method_exists()与is_callable()的区别

php函数method_exists() 与is_callable()的区别在哪?在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable() 相比之下,is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回true.如果要检测类中的方法是否能被调用,可以给函数传递一个数组而不是类的方法名作为参数.数组必须包含对象或类名,以将其作