很久没有梳理过平日里在用xib做界面时的技巧,觉得有必要总结和梳理下:
一、Xib文件的控件针对另一个控件设置多个约束另一个技巧:ctrl拉线至另一个控件,按住shift不放即可设置多个属性;
二、Xib文件的button设置event至代码中,可以设置其argument为none,即没有传入sender,之前一直没有设置过;
三、Xib创建的view和代码view类关联后,在代码中进行控件布局、需要注意的事项(看代码):
//
// DSWelcomeView.swift
// DSWEIBO
//
// Created by 左得胜 on 2017/4/19.
// Copyright © 2017年 zds. All rights reserved.
//
import UIKit
import SDWebImage
class DSWelcomeView: UIView {
// MARK: - 公开控件/属性
@IBOutlet weak var iconIV: UIImageView!
@IBOutlet weak var tipLabel: UILabel!
@IBOutlet weak var iconConsBottom: NSLayoutConstraint!
// MARK: - View LifeCycle
class func initView() -> DSWelcomeView {
let v = Bundle.main.loadNibNamed("DSWelcomeView", owner: nil, options: nil)?.first as! DSWelcomeView
// 如果使用自动布局设置的界面,xib默认的是600*600大小
v.frame = UIScreen.main.bounds
return v
}
/// 视图被添加到window上,表示视图已经显示了
override func didMoveToWindow() {
super.didMoveToWindow()
// 视图是使用自动布局来设置的,只要是使用了自动布局
// 当视图添加到窗口上时,根据父视图的大小,来计算约束值,更新控件位置
// - layoutIfNeeded会直接按照当前的约束直接诶更新控件位置
layoutIfNeeded()
iconConsBottom.constant = bounds.size.height - 200
// 如果控件们的frame还没哟计算好,所有的约束会一起动画!
UIView.animate(withDuration: 1.0, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0, options: [], animations: {
// 更新约束
self.layoutIfNeeded()
}) { (_) in
UIView.animate(withDuration: 1.0, animations: {
self.tipLabel.alpha = 1
}, completion: { (_) in
self.removeFromSuperview()
})
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// 提示:init?(coder aDecoder: NSCoder)只是刚刚从xib的二进制文件将视图数据加载完成,还没有和代码连线建立起关系,开发时千万不能在该方法中处理UI
}
override func awakeFromNib() {
// xib加载的View中,awakeFromNib方法中不需要super;但是这个时候,view的bounds还没有设置
if let urlStr = DSNetworkManager.shared.userAccount.avatar_large, let url = URL(string: urlStr) {
iconIV.sd_setImage(with: url, placeholderImage: UIImage(named: "avatar_default_big"))
}
// FIXME: - tips:右键选中响应的xib文件,sourcecontrol --> discard changes即可单独放弃对单个xib文件更改,恢复到之前的xib文件,其余不用动
// iconIV.layer.cornerRadius = 42.5 // iconIV.bounds.width
// iconIV.layer.masksToBounds = true
}
// MARK: - Private Method
// MARK: - Action
// MARK: - Public Method
// MARK: - 私有控件/属性
}