Day#12 登入画面(1)

前言

确定画面都可以正确呈现与转换後,我们来正式实作登入的画面。

Nav

LoginViewController

我们新增一个nav,title为登入,且把背景色设成白色。
并在navbar新增右上方的按钮为注册,当点下的时候会套用方法didTapRegister

diidTapRegitser会新增一个viewcontroller,并放到receiver stack中。

override func viewDidLoad() {
    super.viewDidLoad()
    title = "Sign In"
    view.backgroundColor = .white

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Sign Up",
                                                        style: .done,
                                                        target: self,
                                                        action: #selector(didTapRegister))
}

// push the register controller to screen
@objc private func didTapRegister(){
    let vc = RegisterViewController()
    vc.title = "Create Account"
    navigationController?.pushViewController(vc, animated: true)
}

Logo

我们要放上登入的logo,因此在asset中右键新增一个image set,命名为logo并将我们想要的图片放上去。

接着在同一个view controller中加上刚刚的图片。使用UIImageView可以呈现一个或多张image於画面上。

LoginViewController

private let imageView: UIImageView = {
    let imageView = UIImageView()
    imageView.image = UIImage(named: "Logo")
    imageView.contentMode = .scaleAspectFit
    return imageView
}()

接着在viewDidLoad加上

view.addSubview(imageView)

确保imageView有被加到画面上!

最後一个小细节,是关於图片尺寸计算的方法,但是在此计算有点麻烦,在程序管理上也不是那麽正确(?),因此我们可以写一个extension,把所有计算的规则放在extension中。

因此可以在resource中新增一个swift档案,就命名为Extensions。

Extensions

import Foundation
import UIKit

extension UIView {
    public var width: CGFloat {
        return self.frame.size.width
    }

    public var height: CGFloat {
        return self.frame.size.height
    }

    public var top: CGFloat {
        return self.frame.origin.y
    }

    public var bottom: CGFloat {
        return self.frame.size.height + self.frame.origin.y
    }

    public var left: CGFloat {
        return self.frame.origin.x
    }

    public var right: CGFloat {
        return self.frame.size.width + self.frame.origin.x
    }
}

其中的长宽就是画面的长宽。而frame.origin是上一层(父层)的相对座标。

LoginViewController

最後我们回到login画面,可以使用刚刚的计算方式去加上图片。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let size = view.width/3
    imageView.frame = CGRect(x: (view.width-size)/2,
                             y: 20,
                             width: size,
                             height: size)
}

结语

可喜可贺,明天会继续把登入画面的输入栏位加上~
过1/3,继续加油!

参考资料

  1. iOS Fundamentals: Frames, Bounds, and CGGeometry

若上述内容有误或可以改进的部分,欢迎留言以及提出任何指教~
谢谢 १|˚–˚|५


<<:  [Day 12] - 初探永丰银行线上收款API - 丰收款

>>:  Day12 Let's ODOO: Security(1) Access right

Day 27:刷题

前言 刷题是应徵流程的一环,但并不是每一家公司都要,通常小公司比较不会有刷题的环节,可以把刷题想成是...

第四天:在 Linux 上安装 Gradle

接下来要跟大家谈谈如何在三大主流作业系统上安装 Gradle,读者可以依据自己习惯使用的作业系统跟着...

【Day25】:从struct进化成class的物件导向技巧(上)

本篇与STM32相关性不大 会有这个章节其实是有原因的...有一天我请学长帮我看一下程序的时候,请我...

[Day04]稽核员守则与伦理

耶!上完课、通过考试之後,是不是就可以出去稽核客户了咧? 是不是可以执行稽核活动,然後就可以稽他!稽...