Swift: 你好, AutoLayout!

作者: chai2010 | 来源:发表于2016-06-23 11:07 被阅读1079次

    Xcode8已经发布,带了Swift3的预览版本,以后都是默认采用Swift3的语法。

    这个例子主要是演示iOS中如何用纯代码实现自动布局,先看看效果。

    ios-auto-layout.png

    还是先创建程序入口文件main.swift:

    import UIKit
    
    let argc = Process.argc
    let argv = UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv)
    
    UIApplicationMain(argc, argv, NSStringFromClass(MainApp), NSStringFromClass(MainAppDelegate))
    

    创建UI程序入口App.swift,增加了一个导航栏:

    import UIKit
    
    class MainApp: UIApplication {
        override func sendEvent(_ event: UIEvent) {
            super.sendEvent(event)
        }
    }
    
    class MainAppDelegate: UIResponder, UIApplicationDelegate {
        
        var window: UIWindow?
        
        func application(_ app: UIApplication, didFinishLaunchingWithOptions opt: [NSObject: AnyObject]?) -> Bool {
            
            self.window = UIWindow(frame: UIScreen.main().bounds)
    
            self.window!.rootViewController = UINavigationController(rootViewController:MainViewController())
            self.window!.backgroundColor = UIColor.white()
            self.window!.makeKeyAndVisible()
            
            return true
        }
    }
    

    然后创建视图控制器ViewController.swift, 在这里实现自动布局:

    import UIKit
    
    class MainViewController: UIViewController {
    
        var label0_: UILabel!
        var label1_: UILabel!
        var label2_: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            self.title = "主视图"
    
            self.label0_ = {
                let label = UILabel()
                label.textAlignment = .center
                label.text = "Hello, AutoLayout!"
                return label
            }()
    
            self.label1_ = {
                let label = UILabel()
                label.textColor = UIColor.red()
                label.textAlignment = .center
                label.text = "=== 你好, AutoLayout! ==="
                return label
            }()
            
            self.label2_ = {
                let label = UILabel()
                label.textColor = UIColor.blue()
                label.textAlignment = .center
                label.text = "=== 底部 ==="
                return label
            }()
    
            self.view.addSubview(self.label0_)
            self.view.addSubview(self.label1_)
            self.view.addSubview(self.label2_)
    
            self.view.setupAutoLayout {
                return (
                    layouts: [
                        ("H:|-(20)-[label0]-20-|",[]),
                        ("H:|-(20)-[label1]-20-|",[]),
                        ("H:|-(20)-[label2]-20-|",[]),
    
                        ("V:|[topGuide]-(0)-[label0(20)]-20-[label1(20)]-(>=0)-[label2]-[bottomGuide]|",[])
                    ],
                    viewsMap: [
                        "topGuide": self.topLayoutGuide,
                        "bottomGuide": self.bottomLayoutGuide,
                        
                        "label0": self.label0_,
                        "label1": self.label1_,
                        "label2": self.label2_
                    ]
                )
            }
        }
    }
    

    其中self.view.setupAutoLayout是针对UIView类型作的扩展:

    extension UIView {
        func setupAutoLayout(closure: () -> (layouts: [(String,NSLayoutFormatOptions)], viewsMap: [String:AnyObject]) ) {
            let (viewsLayouts, viewsMap) = closure()
            
            // 采用自动布局
            for view in viewsMap.values {
                if let v = view as? UIView {
                    v.translatesAutoresizingMaskIntoConstraints = false
                }
            }
            
            // 添加自动布局规则
            for layout in viewsLayouts {
                self.addConstraints(
                    NSLayoutConstraint.constraints(
                        withVisualFormat: layout.0,
                        options: layout.1, metrics: nil,
                        views: viewsMap
                    )
                )
            }
        }
    }
    

    完成。

    相关文章

      网友评论

        本文标题:Swift: 你好, AutoLayout!

        本文链接:https://www.haomeiwen.com/subject/qxwndttx.html