Masonry 在swift下的使用

  Masonry在oc下使用很方便,但是在swift下,由于oc方法和property都可以使用.fuc的语法,swift下只有属性可以使用.property的语法,方法只能写成.func().因此在swift下如果直接写就只能写成

        downTriangle.mas_makeConstraints { (make: MASConstraintMaker? ) in
            _ = make?.left.equalTo()(self)
            _ = make?.bottom.equalTo()(self)
        }
skillTypeText.mas_makeConstraints {
_ = $0?.top.left.equalTo()(self.containerView)?.with().offset()(0)
let size = NSValue(cgSize: CGSize(width:30, height:15))
_ = $0?.size.equalTo()(size)
}

 

 这种写法非常麻烦,也不自然。如果直接使用snapkit又需要引入新的库,所以楼主就对masonry做了些改动。改动后的写法:

        downTriangle.mas_makeConstraints {
             $0.left.sEqualTo(self)
             $0.bottom.sEqualTo(self)
        }

  对于mas_equalTo则可以写成:

        skillTypeText.mas_makeConstraints {
             $0.top.left.sEqualTo(self.containerView).with().sOffset(0)
//            let size = NSValue(cgSize: CGSize(width:30, height:15))
             $0.size.sEqualTo(size: CGSize(width:30, height:15))
        }

  主要改动了以下几个地方:

  1.mas_makeConstraints 及类似方法添加__nonnull的声明

  - (NSArray *)mas_makeConstraints:( void(^ _Nonnull )(MASConstraintMaker* __nonnull make))block;

  2.Masconstraint添加属性声明,本来是想写个category添加个声明,但是失败了,好像只能写在原文件上。

@property (nonatomic, strong, readonly) MASConstraint *left;
@property (nonatomic, strong, readonly) MASConstraint *top;
@property (nonatomic, strong, readonly) MASConstraint *right;
@property (nonatomic, strong, readonly) MASConstraint *bottom;
@property (nonatomic, strong, readonly) MASConstraint *leading;
@property (nonatomic, strong, readonly) MASConstraint *trailing;
@property (nonatomic, strong, readonly) MASConstraint *width;
@property (nonatomic, strong, readonly) MASConstraint *height;
@property (nonatomic, strong, readonly) MASConstraint *centerX;
@property (nonatomic, strong, readonly) MASConstraint *centerY;
@property (nonatomic, strong, readonly) MASConstraint *baseline;

  3.swift下添加sEqualTo,sInset等方法

extension MASConstraint{
    @discardableResult
    func sEqualTo(_ attr : Any?) -> MASConstraint!{
        return self.equalTo()(attr)
    }
    @discardableResult
    func sEqualTo( point : CGPoint) -> MASConstraint!{
        let value = NSValue(cgPoint:point)
        return self.equalTo()(value)
    }
    @discardableResult
    func sEqualTo( size : CGSize) -> MASConstraint!{
        let value = NSValue(cgSize:size)
        return self.equalTo()(value)
    }
    @discardableResult
    func sEqualTo( inset : UIEdgeInsets) -> MASConstraint!{
        let value = NSValue(uiEdgeInsets:inset)
        return self.equalTo()(value)
    }
    @discardableResult
    func sOffset(_ offset : CGFloat) -> MASConstraint!{
        return self.offset()(offset)
    }
    @discardableResult
    func sInset(_ inset : UIEdgeInsets) -> MASConstraint!{
        return self.insets()(inset)
    }
}

  

  masonry使用的各类方法有很多,楼主的项目也很赶,一般也是遇到一个写一个。大致改法都类似。像nsarray+masaddition基本没用,也没必要去添加。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff }
span.s1 { }

时间: 2024-10-13 16:11:01

Masonry 在swift下的使用的相关文章

Objective-C与Swift下的自定义打印函数(Debug和Release)

1.Objective-C 在使用Objective-C进行开发的过程中,为了Debug会不断的设置打印函数.如下图是我们经常用的,用来测试监听方法的实现与否: 1 NSLog(@"%s", __func__); 2 NSLog(@"%s", __FUNCTION__); 需要说明的是,__func__和__FUNCTION__都是C的预定义符号,代表的含义完全相同,就是返回 类名+方法名 的字符串. 注意:1.返回的字符串是C语言的字符串 char * 类型,注意

Swift下CoreData的使用

我之前的随笔中有写过一些iOS持久化存储的方法,包含了sqlite.解归档.沙盒存放等等.这些方式中,能够大规模存储,并保持性能的只有使用sqlite了.而这里将记录下Cocoa自身继承的数据库的存储方案--CoreData的使用. CoreData在底层也是直接采用了sqlite等作为数据库的搭建.只是在上层封装成Cocoa熟悉的方式,这样,即使对于不熟悉其他的数据的开发者来说,也不会感到无从下手. 同时CoreData中加入了可视化地操作数据的关联操作,为我们在Cocoa中使用CoreDat

swift下实现网络音乐下载与播放(最通俗易懂源代码)

// //  ViewController.swift //  网络歌曲播放 // //  Created by xx良 on 14-8-16. //  Copyright (c) 2014年 xx良. All rights reserved. //这是我两天学习网络播放器项目的时候,总结和整理出来的代码,以后想要实现类似的功能,可以拿来就用 import UIKit import AVFoundation class ViewController:UIViewController { var 

swift 下storyboard的页面跳转和传值

------------------1. 最简单的方法 拖拽, 这个就不用多解释了吧. 直接拖拽到另一个视图控制器, 选择 show, 就行了. 2. 利用 Segue 方法 (这里主要是 方法1 的传值) 连好线, 点击 连线中间部分, 设置 Identifier. 然后 调用 performSegueWithIdentifier 方法. (注: Demo 里面, 是直接将 TableViewController 和 SecondViewController 进行连线, 而不是 点击 Cell

iOS开发之 -- oc和swift下输出乘法口诀表

闲来无事,写着玩: oc: //乘法口诀表输出 for (int i = 1; i<=9; i++) { for (int j = 1; j<=i; j++) { NSLog(@"%dx%d=%d\n",i,j,i*j); } } swift: //乘法口诀输入 for i in 1...9 { for j in 1...i { print("\(i)x\(j)=\(i*j)\n") } }

Swift下的字符串查找

var test="11111111111test" if (string.rangeOfString("test") != nil) //注意!=左右的空格 { println("find") } 如果想获得位置,就: var t=string.rangeOfString("test") 开始位置 t?.startIndex 结束位置 t?.endIndex 另,再补充个方法,google的 let string = &qu

Swift(下) 函数 闭包 结构体

// 定义函数时 需要加一个 func关键字 sayHello 为函数名 括号里的为参数(参数名: 参数类型) -> 指的是返回值  {}大括号里面的表示函数体 func sayHello(name:String, number:Int)->String { return name } sayHello("dt", 99) // 我们可以给函数参数加一个标签 (外部参数) 用于提示我们需要输入一个什么样的参数 或者说是干什么用的 func sayGoodBye(peronN

Swift下调用Touch ID实现指纹识别

iOS开发交流群:484884085 欢迎大家增加. 例如以下代码是实现调用5S以上设备指纹识别的代码,依照官网给出的代码,会出现识别成功后非常久才运行成功后调用的代码,逛了非常久的.才知道要将其放入主线程实现才干够. 详细代码例如以下. 1.引入类  import LocalAuthentication //调用指纹识别函数 func loginWithTouchID() { if((UIDevice.currentDevice().systemVersionasNSString).float

Swift下单例模式

import UIKit   class DataCenter: NSObject {       class let dataCenterObj:DataCenter = DataCenter()       class func getDataCenter() ->DataCenter {         return dataCenterObj     } }