开发者俱乐部

标题: Stevia:一款开源、简单、直观的纯代码自动布局类库 [打印本页]

作者: jack    时间: 2016-3-20 00:29
标题: Stevia:一款开源、简单、直观的纯代码自动布局类库

就自动布局而言,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. }
复制代码










欢迎光临 开发者俱乐部 (http://xodn.com/) Powered by Discuz! X3.2