Xib创建的view和代码view类关联后的技巧及注意事项总结

2017-04-19  本文已影响91人  桂宁813

很久没有梳理过平日里在用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: - 私有控件/属性


}
上一篇下一篇

猜你喜欢

热点阅读