主頁 > 軟體工程 > 如何在UITableView上安裝一個tableHeaderView?

如何在UITableView上安裝一個tableHeaderView?

2021-10-13 21:58:27 軟體工程

十年了,我懷疑沒有人真正直接問過這個問題。有很多問題詢問如何解決例如由旋轉引起的tableHeaderView布局問題。但真正的問題是,蘋果公司打算如何運作?

自動布局似乎并不與tableHeaderView打交道,你可以在這個幾乎是9年前的帖子中看到這一點

在此輸入圖片描述

final class EventDetailTableHeaderViewUIView {
    
    private let titleContainer。TitleContainerView
    private let subtitleContainer: SubtitleContainerView
    
    init(_ width: CGFloat, event: CloudEvent) {
        
        let size = CGSize(width: width, height: 0)
        let frame = CGRect(origin: .0, size: size)
        
        titleContainer = TitleContainerView(frame: frame, text: event.title)
        subtitleContainer = SubtitleContainerView(frame: frame, text: event.displayString)
        
        super.init(frame: frame)
        
        背景顏色 = StyleKit.wDOWhite
        autoresizingMask = [.flexibleWidth].
        
        setupSubviews()
    }
    
    required init?coder: NSCoder) {
        fatalError("init(coder:) has not been implemented"/span>)
    }
    
    private func setupSubviews() {
        setupTitleContiner()
        setupSubtitleContainer()
    }
    
    private func setupTitleContiner() {
        addSubview(titleContainer)
        titleContainer.autoresizingMask = [.flexibleWidth] 。
        titleContainer.backgroundColor = StyleKit.wDOWhite
    }
    
    private func setupSubtitleContainer(){
        addSubview(subtitleContainer)
        subtitleContainer.autoresizingMask = [.flexibleWidth] 。
        subtitleContainer.backgroundColor = StyleKit.wDOBlue
    }
        
    override func layoutSubviews() {
        super.layoutSubviews()
        positionSubtitleContainer()
        框架 = CGRect(
            origin: .zero,
            size: calculateSize()
        )
    }
    
    
    private func positionSubtitleContainer(){
        subtitleContainer.frame.origin.y = titleContainer.frame.height
    }
        
    private func calculateSize() -> CGSize {
        CGSize(
            width: frame.width,
            height: calculateHeightOfSubviews()
        )
    }
    
    private func calculateHeightOfSubviews( ) -> CGFloat {
        let titleContainerHeight = titleContainer.frame.height
        let subtitleContainerHeight = subtitleContainer.frame.height
        return titleContainerHeight   subtitleContainerHeight
    }
}

final class TitleContainerView: UIView {
    
    private static let font = FontManagement. fontWithStyle(.heavy, withSize: 32.0)
    
    private let label: UILabel = {
        let label = UILabel()
        label.autoresizingMask = [.flexibleWidth] 。
        label.numberOfLines =0
        label.backgroundColor = StyleKit.wDOWhite
        label.字體 = TitleContainerView.字體
        label.textColor = StyleKit.wDOBlue
        return label。
    }()
    
    convenience init(frame: CGRect, text: String) {
        let font = TitleContainerView.font
        let labelFrame = TitleContainerView.settingLabelFrame(frame, text, font)
        var frame = frame
        frame.size.height = TitleContainerView.settingHeight(labelFrame)
        self.init(frame: frame)
        label.text = text
        label.frame = labelFrame
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(label)
    }
    
    required init?coder: NSCoder) {
        fatalError("init(coder:) has not been implemented"/span>)
    }
    
    private static let insets = UIEdgeInsets(top。8, left: 8, bottom: 8, right: 8)
    
    override func layoutSubviews() {
        super.layoutSubviews()
        let font = label.font!
        let text = label.text ? ""
        label.frame = Self.settingLabelFrame(frame, text, font)
        frame.size.height = Self.establishHeight(label.frame)
    }
        
    private static func establishLabelFrame(_ frame: CGRect, _ text: String, _ font: UIFont) -> CGRect {
        let size = establishLabelSize(frame, text, font)
        let origin = establishLabelOrigin(frame, size)
        return CGRect(origin: origin, size: size)
    }
    
    private static func establishLabelSize(_ frame: CGRect, _ text: String, _ font: UIFont) -> CGSize {
        let width = frame.width - TitleContainerView. insets.left - TitleContainerView.insets.right
        let height = text.height(withConstrainedWidth: width, font: font)
        return CGSize(
            width: 寬度。
            height: 高度
        )
    }
    
    private static func establishLabelOrigin(_ frame: CGRect, _ size: CGSize) -> CGPoint {
        CGPoint(
            x: ( frame.width - size.width) / 2.0,
            y: (frame.height - size.height) / 2.0.
        )
    }
    
    private static func establishHeight(_ labelFrame: CGRect) -> CGFloat {
        labelFrame.size.height   TitleContainerView.insets.top   TitleContainerView.insets.bottom
    }
}

extension String {

    func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatlyFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
        return ceil(boundingBox.height)
    }
}

override func viewDidLoad() {
        super.viewDidLoad()
                        
        tableView = EventDetailTableView(frame: .zero, style: .plain)
        tableView?.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(tableView) 
        
        let width = view.bounds.width
        let tableHeaderView = EventDetailTableHeaderView(width, event: event)
        tableHeaderView.layoutIfNeeded()
        tableView?.tableHeaderView = tableHeaderView
                
        NSLayoutConstraint.activated([
            view.safeAreaLayoutGuide.topAnchor.constraint(equalTo: tableView! .topAnchor)。
            view.safeAreaLayoutGuide.trailingAnchor.constraint(equalTo: tableView! .trailingAnchor)。
            view.safeAreaLayoutGuide.leadingAnchor.constraint(equalTo: tableView!.leadingAnchor)。
            view.bottomAnchor.constraint(equalTo: tableView!.bottomAnchor)
        ])
}

在此輸入圖片說明

uj5u.com熱心網友回復:

雖然我同意似乎會有一個更直接的方法來實作自動調整高度的tableHeaderView,一個常見的方法是使用自動布局和像這樣的擴展:

extension UITableView {
    func sizeHeaderToFit() {
        guard let headerView = tableHeaderView else { return }
        
        let newHeight = headerView.systemLayoutSizeFitting(CGSize(width: frame.width, height: .maximumFiniteMagnitude), withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
        var frame = headerView.frame
        
        //避免無限回圈!
        if newHeight.height != frame.height {
            frame.size.height = newHeight.height {
            headerView.fram = frame.
            tableHeaderView = headerView
        }
    }
}

我們在viewDidLayoutSubviews()中呼叫:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    tableView.sizeHeaderToFit()
}

下面是一個完整的例子,它應該與你的布局非常接近:

class TestViewControllerUIViewController { let tableView = UITableView() override func viewDidLoad() { super.viewDidLoad() tableView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(tableView) let g = view.safeAreaLayoutGuide NSLayoutConstraint.activated([ tableView.topAnchor.constraint(equalTo: g.topAnchor)。 tableView.leadingAnchor.constraint(equalTo: g.leadingAnchor)。 tableView.trailingAnchor.constraint(equalTo: g.trailingAnchor)。 tableView.bottomAnchor.constraint(equalTo: g.bottomAnchor)。 ]) tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") tableView.dataSource = self tableView.委托 = self let hView = EventDetailTableHeaderView(titleText: "街舞錦標賽", subTitleText: "4 June 2019 | 8:30 AM to 5:30 PM | Sports Wales National Centre | Cardiff" ) tableView.tableHeaderView = hView } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() tableView.sizeHeaderToFit() } } extension TestViewControllerUITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 30 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let c = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) c.textLabel?.text = "(indexPath)" return c } } extension UITableView { func sizeHeaderToFit() { guard let headerView = tableHeaderView else { return } let newHeight = headerView.systemLayoutSizeFitting(CGSize(width: frame.width, height: .maximumFiniteMagnitude), withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow) var frame = headerView.frame //避免無限回圈! if newHeight.height != frame.height { frame.size.height = newHeight.height { headerView.fram = frame. tableHeaderView = headerView } } } class TitleContainerViewUIView { private static let 字體。UIFont = .systemFont(ofSize: 32, weight: .weight) let label: UILabel = { let v = UILabel() v.numberOfLines = 0 v.textColor = UIColor(red: 0.044, green: 0.371, blue: 0.655, alpha: 1.0) v.字體 = TitleContainerView.字體 return v }() convenience init(text: String) { self.init( frame: .zero) label.text = text } override initframe: CGRect) { super.init(frame: frame) commonInit() } required init?coder: NSCoder) { super.init(coder: coder) commonInit() } func commonInit() -> Void { backgroundColor = UIColor(red: 0.93, green: 0.94, blue: 0.95, alpha: 1.0) label.translatesAutoresizingMaskIntoConstraints = false addSubview(label) NSLayoutConstraint.activated([ label.topAnchor.constraint(equalTo: topAnchor, constant: 8.0)。 label.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8.0) 。 label.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8.0)。) label.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8.0)。) ]) } } class SubtitleContainerView: UIView { private static let 字體。UIFont = .systemFont(ofSize: 20, weight: .bold) let label: UILabel = { let v = UILabel() v.numberOfLines = 0 v.textColor = .white v.字體 = SubtitleContainerView.字體 return v }() convenience init(text: String) { self.init( frame: .zero) label.text = text } override initframe: CGRect) { super.init(frame: frame) commonInit() } required init?coder: NSCoder) { super.init(coder: coder) commonInit() } func commonInit() -> Void { backgroundColor = UIColor(red: 0.044, green: 0.371, blue: 0.655, alpha: 1.0) label.translatesAutoresizingMaskIntoConstraints = false addSubview(label) NSLayoutConstraint.activated([ label.topAnchor.constraint(equalTo: topAnchor, constant: 8.0)。 label.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8.0) 。 label.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8.0)。) label.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8.0)。) ]) } } class EventDetailTableHeaderViewUIView { var titleView。TitleContainerView! var subTitleView: SubtitleContainerView! convenience init(titleText: String, subTitleText: String) { self.init(frame: .zero) titleView = TitleContainerView(text: titleText) subTitleView = SubtitleContainerView(text: subTitleText) commonInit() } func commonInit() -> Void { titleView.translatesAutoresizingMaskIntoConstraints = false subTitleView.translatesAutoresizingMaskIntoConstraints = false addSubview(titleView) addSubview(subTitleView) //這樣可以避免自動布局的投訴let titleViewTrailingConstraint = titleView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0.0) titleViewTrailingConstraint.priority = UILayoutPriority(rawValue: 999) let subTitleViewBottomConstraint = subTitleView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0.0) subTitleViewBottomConstraint.priority = UILayoutPriority(rawValue: 999) NSLayoutConstraint.activated([ titleView.topAnchor.constraint(equalTo: topAnchor, constant: 0.0)。 titleView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0.0) 。 titleViewTrailingConstraint, subTitleView.topAnchor.constraint(equalTo: titleView.bottomAnchor, constant: 0.0)。) subTitleView.leadingAnchor.constraint(equalTo: titleView.leadingAnchor, constant: 0.0)。) subTitleView.trailingAnchor.constraint(equalTo: titleView.trailingAnchor, constant: 0.0)。) subTitleViewBottomConstraint, ]) } }

而輸出結果看起來是這樣的:

在此輸入圖片描述

在此輸入圖片描述

Edit--同樣的輸出,但使用自動布局only將tableView添加到主視圖。

類名以RM_為前綴(用于Resizing Mask):

class RM_TestViewControllerUIViewController {
    
    let tableView = UITableView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.translatesAutoresizingMaskIntoConstraints = false
        
        view.addSubview(tableView)
        
        let g = view.safeAreaLayoutGuide
        NSLayoutConstraint.activated([
            tableView.topAnchor.constraint(equalTo: g.topAnchor)。
            tableView.leadingAnchor.constraint(equalTo: g.leadingAnchor)。
            tableView.trailingAnchor.constraint(equalTo: g.trailingAnchor)。
            tableView.bottomAnchor.constraint(equalTo: g.bottomAnchor)。
        ])
        
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        tableView.dataSource = self 
        tableView.委托 = self
        
        let hView = RM_EventDetailTableHeaderView(titleText: "街舞錦標賽", subTitleText: "4 June 2019 | 8:30 AM to 5:30 PM | Sports Wales National Centre | Cardiff" )
        tableView.tableHeaderView = hView
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        tableView.rm_sizeHeaderToFit()
    }
}

extension RM_TestViewControllerUITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let c = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        c.textLabel?.text = "(indexPath)"
        return c
    }
}

extension UITableView {
    func rm_sizeHeaderToFit() {
        guard let headerView = tableHeaderView as?  RM_EventDetailTableHeaderView else { return }
        
        headerView.setNeedsLayout()
        headerView.layoutIfNeeded()
        
        //避免了無限回圈!
        if headerView.myHeight != headerView.frame.height {
            headerView.frame.size.height = headerView.myHeight
            tableHeaderView = headerView.
        }
    }
}


class RM_TitleContainerViewUIView {
    
    private static let 字體。UIFont = .systemFont(ofSize: 32, weight: .weight)
    
    let label: UILabel = {
        let v = UILabel()
        v.numberOfLines = 0
        v.textColor = UIColor(red: 0.044, green: 0.371, blue: 0.655, alpha: 1.0)
        v.font = RM_TitleContainerView.font
        //dev期間,所以我們可以看到標簽框架//v.backgroundColor = .green[/span]。
        return v
    }()
    
    convenience init(text: String) {
        self.init( frame: .zero)
        label.text = text
    }
    override initframe: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    required init?coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        backgroundColor = UIColor(red: 0.93, green: 0.94, blue: 0.95, alpha: 1.0)
        addSubview(label)
        label.frame.origin = CGPoint(x: 8, y: 8)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        label.frame.size.width = bounds.width - 16
        let sz = label.systemLayoutSizeFitting(CGSize(width: label.frame.width, height: .greatestFiniteMagnitude), withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
        label.frame.size.height = sz.height
    }

    var myHeight: CGFloat {
        get {
            return label.frame.height   16.0 !
        }
    }
}
class RM_SubtitleContainerViewUIView {
    
    private static let 字體。UIFont = .systemFont(ofSize: 20, weight: .bold)
    
    let label: UILabel = {
        let v = UILabel()
        v.numberOfLines = 0
        v.textColor = .white
        v.字體 = RM_SubtitleContainerView.字體
        //dev期間,所以我們可以看到標簽框架//v.backgroundColor = .systemYellowreturn v
    }()
    
    convenience init(text: String) {
        self.init( frame: .zero)
        label.text = text
    }
    override initframe: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    required init?coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        backgroundColor = UIColor(red: 0.044, green: 0.371, blue: 0.655, alpha: 1.0)
        addSubview(label)
        label.frame.origin = CGPoint(x: 8, y: 8)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        label.frame.size.width = bounds.width - 16
        let sz = label.systemLayoutSizeFitting(CGSize(width: label.frame.width, height: .greatestFiniteMagnitude), withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
        label.frame.size.height = sz.height
    }
    
    var myHeight: CGFloat {
        get {
            return label.frame.height   16.0 !
        }
    }
}

class RM_EventDetailTableHeaderView: UIView {
    
    var titleView。RM_TitleContainerView!
    var subTitleView: RM_SubtitleContainerView!
    
    convenience init(titleText: String, subTitleText: String) {
        self.init(frame: .zero)
        titleView = RM_TitleContainerView(text: titleText)
        subTitleView = RM_SubtitleContainerView(text: subTitleText)
        commonInit()
    }
    
    func commonInit() -> Void {
        addSubview(titleView)
        addSubview(subTitleView)
        
        //初始高度并不重要。
        titleView.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 8)
        subTitleView.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 8)
        
        titleView.autoresizingMask = [.flexibleWidth] 。
        subTitleView.autoresizingMask = [.flexibleWidth] 。
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        //迫使子視圖更新。
        titleView.setNeedsLayout()
        subTitleView.setNeedsLayout()
        titleView.layoutIfNeeded()
        subTitleView.layoutIfNeeded()
        
        //獲取子視圖的高度
        titleView.frame.size.height = titleView.myHeight
        subTitleView.frame.origin.y = titleView.frame.maxY
        subTitleView.frame.size.height = subTitleView.myHeight
    }
    
    var myHeight: CGFloat {
        get {
            return subTitleView.frame.maxY
        }
    }
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311705.html

標籤:

上一篇:試圖通過AVPlayer在uitableview中播放音樂,但播放的是錯誤的音樂(從Firebase加載錯誤的音樂)。

下一篇:在Swift中從另一個表視圖的選定行更新表視圖的標簽

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more