新技术论坛
搜索
查看: 1034|回复: 0
打印 上一主题 下一主题

[iOS/OS X] Stevia:一款开源、简单、直观的纯代码自动布局类库

[复制链接]
  • TA的每日心情
    开心
    2016-10-18 06:23
  • 签到天数: 72 天

    连续签到: 1 天

    [LV.6]常住居民II

    扫一扫,手机访问本帖
    楼主
    跳转到指定楼层
    发表于 2016-3-20 00:29:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    就自动布局而言,AutoLayout已经成为iOS开发者应用开发中必不可少的一部分,苹果一直主张开发者使用AutoLayout来布局,而关于iOS自动布局教程与经验分享亦数不胜数。但不可否认的是,Autolayout太过繁琐复杂,由此出现了Autosizing。除此之外,还有一种解决方案,就是Stevia(GitHub托管地址)。

    Stevia是一款非常直观的纯代码自动布局类库,其主要贡献者S4cha在GitHub上写明了为什么会开发出这样一个自动布局类库:因为没有什么并纯代码更赞,Xibs和storyboards太过繁重、很难维护以及合并,将视图拆分成两个独立文件来调试简直就是一场噩梦,我们必须拥有一个更为便捷、效率更高的解决方案。

    以登陆界面为例:


    Login View Example

    使用原生AutoLayout:

    1. class LoginViewNative:UIView {

    2.     let email = UITextField()
    3.     let password = UITextField()
    4.     let login = UIButton()

    5.     convenience init() {
    6.         self.init(frame:CGRectZero)
    7.         backgroundColor = .whiteColor()

    8.         addSubview(email)
    9.         addSubview(password)
    10.         addSubview(login)

    11.         email.translatesAutoresizingMaskIntoConstraints = false
    12.         password.translatesAutoresizingMaskIntoConstraints = false
    13.         login.translatesAutoresizingMaskIntoConstraints = false

    14.         addConstraint(NSLayoutConstraint(
    15.                 item: email,
    16.                 attribute: .Left,
    17.                 relatedBy: .Equal,
    18.                 toItem: self,
    19.                 attribute: .Left,
    20.                 multiplier: 1,
    21.                 constant: 8)
    22.         )
    23.         addConstraint(NSLayoutConstraint(
    24.                 item: email,
    25.                 attribute: .Right,
    26.                 relatedBy: .Equal,
    27.                 toItem: self,
    28.                 attribute: .Right,
    29.                 multiplier: 1,
    30.                 constant: -8)
    31.         )
    32.         addConstraint(NSLayoutConstraint(
    33.             item: password,
    34.             attribute: .Left,
    35.                 relatedBy: .Equal,
    36.                 toItem: self,
    37.                 attribute: .Left,
    38.                 multiplier: 1,
    39.                 constant: 8)
    40.         )
    41.         addConstraint(NSLayoutConstraint(
    42.             item: password,
    43.             attribute: .Right,
    44.             relatedBy: .Equal,
    45.             toItem: self,
    46.             attribute: .Right,
    47.             multiplier: 1,
    48.             constant: -8)
    49.         )
    50.         addConstraint(NSLayoutConstraint(
    51.             item: login,
    52.             attribute: .Left,
    53.             relatedBy: .Equal,
    54.             toItem: self,
    55.             attribute: .Left,
    56.             multiplier: 1,
    57.             constant: 0)
    58.         )
    59.         addConstraint(NSLayoutConstraint(
    60.             item: login,
    61.             attribute: .Right,
    62.             relatedBy: .Equal,
    63.             toItem: self,
    64.             attribute: .Right,
    65.             multiplier: 1,
    66.             constant: 0)
    67.         )
    68.         for b in [email, password, login] {
    69.             addConstraint(NSLayoutConstraint(
    70.                 item: b,
    71.                 attribute: .Height,
    72.                 relatedBy: .Equal,
    73.                 toItem: nil,
    74.                 attribute: .NotAnAttribute,
    75.                 multiplier: 1,
    76.                 constant: 80)
    77.             )
    78.         }
    79.         addConstraint(NSLayoutConstraint(
    80.             item: email,
    81.             attribute: .Top,
    82.             relatedBy: .Equal,
    83.             toItem: self,
    84.             attribute: .Top,
    85.             multiplier: 1,
    86.             constant: 100)
    87.         )
    88.         addConstraint(NSLayoutConstraint(
    89.             item:email,
    90.             attribute: .Bottom,
    91.             relatedBy: .Equal,
    92.             toItem: password,
    93.             attribute: .Top,
    94.             multiplier: 1,
    95.             constant: -8)
    96.         )
    97.         addConstraint(NSLayoutConstraint(
    98.             item: login,
    99.             attribute: .Bottom,
    100.             relatedBy: .Equal,
    101.             toItem: self,
    102.             attribute: .Bottom,
    103.             multiplier: 1,
    104.             constant: 0)
    105.         )

    106.         email.placeholder = "Email"
    107.         email.borderStyle = .RoundedRect
    108.         email.autocorrectionType = .No
    109.         email.keyboardType = .EmailAddress
    110.         email.font = UIFont(name: "HelveticaNeue-Light", size: 26)
    111.         email.returnKeyType = .Next

    112.         password.placeholder = "Password"
    113.         password.borderStyle = .RoundedRect
    114.         password.font = UIFont(name: "HelveticaNeue-Light", size: 26)
    115.         password.secureTextEntry = true
    116.         password.returnKeyType = .Done

    117.         login.setTitle("Login", forState: .Normal)
    118.         login.backgroundColor = .lightGrayColor()
    119.         login.addTarget(self, action: "loginTapped", forControlEvents: .TouchUpInside)
    120.         login.setTitle(NSLocalizedString("Login", comment: ""), forState: .Normal)
    121.     }

    122.     func loginTapped() {
    123.         //Do something
    124.     }
    125. }
    复制代码


    使用Stevia:

    1. class LoginViewStevia:UIView {

    2.     let email = UITextField()
    3.     let password = UITextField()
    4.     let login = UIButton()

    5.     convenience init() {
    6.         self.init(frame:CGRectZero)
    7.         backgroundColor = .whiteColor()

    8.         sv(
    9.             email.placeholder("Email").style(fieldStyle), //.style(emailFieldStyle),
    10.             password.placeholder("Password").style(fieldStyle).style(passwordFieldStyle),
    11.             login.text("Login").style(buttonStyle).tap(loginTapped)
    12.         )

    13.         layout(
    14.             100,
    15.             |-email-| ~ 80,
    16.             8,
    17.             |-password-| ~ 80,
    18.             "",
    19.             |login| ~ 80,
    20.             0
    21.         )
    22.     }

    23.     func fieldStyle(f:UITextField) {
    24.         f.borderStyle = .RoundedRect
    25.         f.font = UIFont(name: "HelveticaNeue-Light", size: 26)
    26.         f.returnKeyType = .Next
    27.     }

    28.     func passwordFieldStyle(f:UITextField) {
    29.         f.secureTextEntry = true
    30.         f.returnKeyType = .Done
    31.     }

    32.     func buttonStyle(b:UIButton) {
    33.         b.backgroundColor = .lightGrayColor()
    34.     }

    35.     func loginTapped() {
    36.         //Do something
    37.     }
    38. }
    复制代码





    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    手机版|Archiver|开发者俱乐部 ( ICP/ISP证:辽B-2-4-20110106号 IDC证:辽B-1-2-20070003号 )

    GMT+8, 2024-12-23 11:24 , Processed in 0.109074 second(s), 22 queries .

    X+ Open Developer Network (xodn.com)

    © 2009-2017 沈阳讯网网络科技有限公司

    快速回复 返回顶部 返回列表