• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SwiftUI基礎——創建并組合視圖

    標簽: SwiftUI 入門  ios  swift

    Swift UI 基礎

    今天開 2020 年的 WWDC 了,所以來學習一下 Apple 的 app 開發吧。

    這篇文章是 Apple 給的 SwiftUI 官方教程的一部分,我自己閱讀學習的時候順便翻譯的,并加入了一些我自己的理解、看法和拓展。

    英文原文:https://developer.apple.com/tutorials/swiftui/tutorials

    創建并組合視圖

    原文鏈接:https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

    這個教程教你構建一個 iOS app —— Landmarks。這個 App 是用來發現、分享你喜歡的地點的。我們會從構建一個顯示地標(Landmarks) 詳情的 View 開始。

    要布局這個地標詳情的 View,我們用 stacks 來組合、堆放1 圖片和文本視圖組件。我們還要用引入 MapKit 組件來提供地圖視圖。在你修改視圖的時候,Xcode 會給你及時的反饋,讓你看到改變的代碼。

    下載項目文件,跟著下面的步驟開始構建工程吧:

    預計用時:40 分鐘

    下載項目文件:https://docs-assets.developer.apple.com/published/b90bcabe8b9615e22850aaf17f3e7dfd/110/CreatingAndCombiningViews.zip

    Xcode 11:https://itunes.apple.com/us/app/xcode/id497799835?mt=12

    § 1 創建新項目和探索畫布

    原文鏈接:https://developer.apple.com/tutorials/swiftui/creating-and-combining-views#create-a-new-project-and-explore-the-canvas

    在 Xcode 創建一個使用 SwiftUI 的新項目。在里面探索畫布、預覽和 SwiftUI 的模版代碼。

    要在 Xcode 里預覽視圖,并與之交互,需要 macOS Catalina 10.15。2

    Step 1. 打開 Xcode,然后在 Xcode 的啟動頁面點擊 Create a new Xcode project,或者選擇 File > New > Project3 一張屏幕截圖,Welcome to Xcode頁面的,當你打開Xcode的時候會顯示。當你打開Xcode時,有三個選項可供選擇。開始使用一個playground,創建一個新的Xcode項目,和克隆一個現有的項目。第二個選項--創建一個新的Xcode項目--被突出顯示。

    Step 2. 在模版選擇窗口里選擇 iOS 平臺、Single View App 模版,然后點擊 NextXcode中的模板選擇表的截圖。在最上面一行中,iOS被選為平臺。在應用部分,選擇了單視圖App作為模板;在工作表右下角的下一步按鈕上方有一個高亮顯示。

    Step 3. 在 Product Name 處輸入“Landmarks”,user interface 選擇 SwiftUI,點擊 Next。然后選擇一個位置在你的 Mac 上保存這個項目。Xcode中的模板選擇表截圖。在最上面一行中,iOS被選為平臺。在應用部分,選擇了單視圖App作為模板;在工作表右下角的下一步按鈕上方有一個高亮顯示。

    Step 4. 在項目導航欄(Project navigator)里選擇ContentView.swift。默認情況下,SwiftUI 聲明了兩個結構體,第一個遵循了 View 協議,是用來描述視圖的內容和布局的;第二個結構體聲明了對這個視圖的預覽。

    代碼以及來預覽的屏幕截圖,預覽是iPhone上顯示的效果,文字"Hello World!"位于預覽的中間。

    Step 5. 在畫布(canvas)里點擊 **Resume ** 來顯示預覽。

    Tips:如果畫布沒有顯示,你可以選擇Editor > Editor and Canvas,來打卡它。

    A screenshot of the Preview window, with a Refresh button in its upper-right corner.

    Step 6. 在 body 屬性里,把 “Hello World” 改成對你自己打招呼的話。

    在你改變視圖體(a view’s body property)的時候,預覽及時地反映出了你的改變。

    代碼以及來預覽的屏幕截圖,預覽是iPhone上顯示的效果,文字"Hello SwiftUI!"位于預覽的中間。

    完成這一節后,我們的主要代碼看上去是這樣的:

    struct ContentView: View {
        var body: some View {
            Text("Hello SwiftUI!")
        }
    }
    

    【譯注】:由于本人使用 MacOS Mojave 10.14,所以無法使用預覽的功能。這還是相當痛苦的,沒有預覽幾乎難以進行 UI 設計了,所以我采取的代替方案是在 Playground 中寫 SwiftUI。實現的步驟如下:

    新建一個 Playground,選擇 iOS 平臺,Blank 模版。打開 Playground 后,把里面的代碼替換如下:

    import SwiftUI
    import PlaygroundSupport
    
    struct HelloWoldView: View {
        var body: some View {
            Text("Hello World")
        }
    }
    
    PlaygroundPage.current.setLiveView(HelloWoldView())
    
    

    運行 Playground 至第 10 行(鼠標移到第十行的行標處,數字變成表示運行的箭頭?,點擊這個箭頭),即可看到預覽:

    一張 Playground 的截圖,左邊寫了前文里的 Hello World 程序代碼,右邊顯示出了預覽——一個空白的頁面中間顯示有文本 Hello World

    這樣勉強可以進行 SwiftUI 的開發,只是無法如在 Catalina 的 Xcode 項目里那樣和畫布交互。

    § 2 定制文本視圖(Text View)

    原文鏈接: https://developer.apple.com/tutorials/swiftui/creating-and-combining-views#customize-the-text-view

    通過修改代碼,你可以定制視圖的顯示效果。當然,你也可以用檢視器(inspector)來發現你可以做些什么,并幫助你完成代碼。

    在構建 Landmarks app 的過程中,你可以隨意使用任何編輯器:代碼編輯器(source editor),畫布(canvas),檢視器(inspectors)。無論你使用了那種方式來編輯,代碼總會自動保持更新。

    接下來,我們將使用監視器來定制文本視圖。

    Step 1. 在預覽中,按住 command 點擊我們寫了問候的文本,會出現一個結構編輯彈出框(popover)。在這個彈出框里,選擇 Inspect

    這個彈出框里還有其他的你可以定制的屬性,不同的視圖可能有不同的屬性。

    結構編輯彈出框的截圖

    Step 2. 在檢視器中,把文本(Text)改成 “Turtle Rock” —— 你的 app 中要展現的第一個地標。

    在檢視器中,把文本(Text)改成 “Turtle Rock”的截圖

    Step 3. 把字體修改成 Title (標題)。

    這個操作是讓文本使用系統字體,這種字體可以跟隨用戶當前的偏好設置。

    【譯注】也可以使用代碼完成這個更改: Text("Turtle Rock").font(.title)。哈哈,這種寫法就很 Swift,具體這是什么意思下面的原文有寫。

    在檢視器中,修改字體的截圖

    要用 SwiftUI 定制視圖,我們可以調用稱作修飾器(modifiers)的方法。修飾器會包裝一個 View 來更改其顯示效果或其他屬性。每個修飾器都會返回一個新的 View,所以我們常鏈式調用多個修飾器以疊加效果。

    Step 4. 手動修改代碼,添加一個修飾器:foregroundColor(.green),這是用來把文本顏色改成綠色的:

    修改后的代碼和來自Xcode預覽的截圖,它顯示一個在iPhone上的效果預覽,綠色的文字,Turtle Rock,在顯示器的中間。

    代碼才是我們的視圖效果的依據,當你用檢視器來修改或移除修飾器時,Xcode 都會立刻在代碼里做出相應的修改。

    Step 5. 現在,我們在代碼里按住 Command 點擊 Text 的聲明,從彈出框里選擇 Inspect,這樣也可以打開監視器。在 Color 菜單里,把顏色設置成 Inherited,這樣文本的顏色就復原了。

    來自Xcode的結構化編輯器菜單截圖,通過Command-點擊文本視圖的聲明打開。

    Step 6. 注意,完成剛才那一步之后, Xcode 自動幫我們把代碼做了相應的修改,即去掉了修飾器 foregroundColor(.green)

    原文里的代碼和預覽的截圖


    完成這一節后,我們的主要代碼看上去是這樣的:

    struct ContentView: View {
        var body: some View {
            Text("Turtle Rock")
                .font(.title)
    
        }
    }
    

    § 3 用 Stacks 組合視圖

    原文鏈接: https://developer.apple.com/tutorials/swiftui/creating-and-combining-views#Combine-Views-Using-Stacks

    在上一節我們完成了一個標題。現在,我們將再添加一些文本視圖來描述地標的詳細信息,比如所處的公園名稱和所在的州。

    在使用 SwiftUI 創建 View 時,我們在視圖的 body 屬性里描述其內容、布局、行為。但是,body 屬性只會返回一個視圖。所以,我們要把多個視圖放到 stack 里來讓它們在水平、豎直、前后方向上組合在一起。

    一個VStack的示意圖,在視圖的上半部分顯示了Turtle Rock的標題左對齊。下面是一個被高光包圍的HStack。HStack包含三個視圖。左邊的視圖顯示文本"Joshua Tree National Park"。中間的視圖是一個隔板Spacer。右邊的視圖顯示文字 "California"

    在這一節里,我們我們將用一個豎直方向的 stack 來把標題放在一個包含了地標細節的水平 stack 的上方。

    (emmm,我一直不太會翻譯這種比較長的英文句子,可能是我語文學的不好吧,我不知道怎么解耦這種有嵌套結構的句子)

    我們 Xcode 的結構編輯(structured editing)提供把一個 view 嵌入一個容器視圖、打開檢視器和其他許多有用的操作。

    Step 1. 按住 Command 點擊文本視圖的初始化器(構造函數啦),會顯示出結構編輯彈出框,在里面選擇 Embed in VStack(嵌入VStack)。

    當你Command點擊文本初始化器時顯示的彈出式菜單的截圖。在菜單中,"嵌入VStack "選項被高亮顯示。

    接下來,我們將通過從庫里拖一個 Text 放到 Stack 里增加一個文本視圖。

    Step 2. 點擊位于 Xcode 窗口右上方的加號(+)打開庫。從里面拖一個 Text 出來放到我們的“Turtle Rock”文本視圖代碼的后面。

    畫布和預覽的截圖,以及庫窗口,顯示了Turtle Rock下方的新文本視圖。

    Step 3. 把新的文本視圖的內容替換為“Joshua Tree National Park”。

    代碼和預覽截圖,預覽中顯示了Turtle Rock下方的新文本視圖。

    接下來我們還會定制剛剛添加的那個表示位置的文本視圖,以匹配所需的布局。

    Step 4. 設置位置文本的字體為 subheadline(副標題)。

    Text("Joshua Tree National Park")
    	.font(.subheadline)
    

    Step 5. 編輯 VStack 的初始化器來指定視圖前緣對齊(align the views by their leading edges,就是把左邊對齊了,Android 里的 gravity="start" 這種意思吧)。

    默認情況下,stack 會沿其軸線把內容中心對齊,并且只提供適合內容的空間。

    代碼和預覽的截圖,預覽是顯示的是iPhone上的效果,Turtle Rock和Joshua Tree National Park文本在顯示屏的中間左對齊。

    接下來,我們要在表示位置的文本右邊增加一個文本,表示其所在的州。

    Step 6. 在畫布中,按住 Command 點擊 Joshua Tree National Park,選擇 Embed in HStack(嵌入HStack)。

    彈出窗口的截圖,菜單中高亮顯示Embed in HStack。

    Step 7. 在位置后面新建一個文本視圖,把內容改成州名,把字體設置為 subheadline。

    代碼和預覽的截圖

    Step 8. 為了讓我們的布局占滿整個設備的屏幕寬度,我們在包含公園和州名的 HStack 里添加一個 Spacer 來把兩個文本視圖分開。

    Spacer 用來“撐大”容器布局,使其占滿整個水平或豎直方向的父視圖(its parent view)空間,而不再只是恰好包含內容。

    代碼和預覽的截圖

    Step 9. 最后,使用 padding() 修飾方法給地標的名稱和細節增加一點空間。

    代碼和預覽的截圖


    完成這一節后,我們的主要代碼看上去是這樣的:

    struct ContentView: View {
        var body: some View {
            VStack(alignment: .leading) {
                Text("Turtle Rock")
                    .font(.title)
                HStack{
                    Text("Joshua Tree National Park")
                        .font(.subheadline)
                    Spacer()
                    Text("California")
                        .font(.subheadline)
                }
            }
            .padding()
        }
    }
    

    § 4 創建自定義圖片視圖(Custom Image View)

    現在,咱們的地標名稱、位置都已經安排好了。下一步,我們打算加一張地標的圖片。

    我們將創建一個新的自定義視圖,而不是直接在現在的文件里繼續寫更多的代碼了。這個自定義視圖將包含有遮罩、邊框和投影。

    首先,我們要先添加圖片到項目的資產目錄( asset catalog)。

    Step 1.turtlerock.png (在Apple給的項目文件里的 Resources 文件夾里有)把它拖到 資產目錄 編輯器里,Xcode 會為這個新圖片創建一個圖片集。

    資產目錄的截圖,圖片放在1倍槽中。

    【譯注】那個圖片就是下面這張

    turtlerock

    接下來,我們要創建一個新的 SwiftUI View 來寫我們的自定義圖片視圖。

    Step 2. 選擇 File > New > File,打開模版選擇器,在 User Interface 中,選擇 SwiftUI View,然后點 Next,把文件名取成 CircleImage.swift,然后點 Create

    新文件類型選擇器的截圖,高亮顯示SwiftUI View和下一步按鈕。

    現在,我們就準備好插入圖片,然后修改顯示效果來達到我們的預期目標了。

    Step 3. 用我們剛才準備好的圖片來替換新建的文件里的文本視圖,用 Image(_:) 來顯示一張圖片。

    使用Image顯示圖片的代碼和預覽截圖

    【譯注】在 Playground 里寫 Image("turtlerock") 要不成,要用 Image(uiImage: UIImage(named: "turtlerock.jpg")!)

    Step 4. 添加一個 clipShape(Circle()) 調用來把圖片裁剪為圓形。

    Circle 類型是一個形狀,你可以把它當遮罩(mask)用,也可以把它作為一個圓形的視圖(有圓形的筆觸或者圓形填充的)。

    把Image顯示圖片變成圓形的代碼和預覽效果截圖

    Step 5. 再創建一個新的灰色筆觸的圓,然后把它作為 overlay 加到我們之前的 Image 上,這樣可以作出一個邊框效果。

    代碼和預覽效果截圖,加了灰色的圓形邊框

    Step 6. 接下來,添加一個半徑為 10 點的陰影。

    代碼和預覽效果截圖,加了陰影

    Step 7. 把邊框顏色改成白色。

    代碼和預覽效果截圖,把邊框顏色改成了白色

    現在,我們的自定義圖片視圖就完成了。


    完成這一節后,我們的主要代碼看上去是這樣的:

    struct CircleImage: View {
        public var body: some View {
            // Playground 里換成:Image(uiImage: UIImage(named: "turtlerock.jpg")!)
            Image("turtlerock")
                .clipShape(Circle())
                .overlay(
                    Circle().stroke(Color.white, lineWidth: 4))
                .shadow(radius: 10)
    }
    

    Clown0te("防盜文爬:)蟲的追蹤標簽,讀者不必在意").by(CDFMLR)
    

    § 5 同時使用 SwiftUI 和 UIKit

    現在,咱打算做一個地圖視圖了。我們可以用一個來自 MapKitMKMapView 類來提供一個地圖視圖。

    要在 SwiftUI 中使用 UIView 的子類,我們要把它用一個實現了 UIViewRepresentable 協議的 SwiftUI 視圖包裹起來。SwiftUI 也對 WatchKit 和 AppKit 的視圖提供了相似的協議。

    MapKit視圖截圖,約書亞樹國家公園上有一個標記。

    首先,我們要自定義一個視圖來包裝 MKMapView。

    Step 1. 選擇 File > New > File,打開模版選擇器,在 User Interface 中,選擇 SwiftUI View,然后點 Next,把文件名取成 MapView.swift,然后點 Create

    新建文件類型選擇器的截圖,高亮顯示SwiftUI View和下一步按鈕。

    Step 2. 添加一個 import 語句來導入 MapKit,然后讓 MapView 遵循 UIViewRepresentable 協議:

    // MapView.swift
    
    import SwiftUI
    import MapKit
    
    struct MapView: UIViewRepresentable {
        var body: some View {
            Text("Hello World")
        }
    }
    
    struct MapView_Previews: PreviewProvider {
        static var previews: some View {
            MapView()
        }
    }
    

    別介意 Xcode 提示的錯誤,我們將在接下來幾步里解決這些問題。

    接下來我們要完成 UIViewRepresentable 要求兩個實現:

    • makeUIView(context:):這個方法用來創建 MKMapView;
    • updateUIView(_:context:):這個方法用來設定視圖,并對任意改變作出響應。

    Step 3. 把新建的視圖里的 body 屬性的代碼替換成定義一個 makeUIView(context:) 方法,這個方法用來創建并返回一個新的 KMapView

    struct MapView: UIViewRepresentable {
        func makeUIView(context: Context) -> MKMapView {
            MKMapView(frame: .zero)
        }
    }
    

    Step 4. 在 MapView 里添加一個 updateUIView(_:context:) 方法來設置我們的地圖把要顯示的位置放到中心位置。

    func updateUIView(_ uiView: MKMapView, context: Context) {
        let coordinate = CLLocationCoordinate2D(
            latitude: 34.011286, longitude: -116.166868)
        let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
        let region = MKCoordinateRegion(center: coordinate, span: span)
        uiView.setRegion(region, animated: true)
    }
    

    由于在靜態模式(static mode)下預覽只會渲染 SwiftUI 視圖,而我們的地圖是個 UIView 的子類,所以我們需要把預覽調到 live 模式(live preview)才能看見地圖。

    Step 5. 點擊 Live Preview 按鈕來把預覽調至 live 模式。然后,你可能還需要點擊 Try Again 或者 Resume 按鈕才能顯示出預期的效果。

    Xcode畫布的截圖,選擇了Live Preview按鈕。

    現在,我們將看見一張顯示著 Joshua Tree National Park 的地圖——這就是我們的地標 Turtle Rock 的家。


    這一節里,我們完成的主要代碼看上去是這樣的:

    struct MapView: UIViewRepresentable {
        func makeUIView(context: Context) -> MKMapView {
            MKMapView(frame: .zero)
        }
        
        func updateUIView(_ uiView: MKMapView, context: Context) {
            let coordinate = CLLocationCoordinate2D(
                latitude: 34.011286, longitude: -116.166868)
            let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
            let region = MKCoordinateRegion(center: coordinate, span: span)
            uiView.setRegion(region, animated: true)
        }
    }
    

    § 6 組成 Detail 視圖

    現在,我們已經構建完了我們需要的一切——地標的名字和位置、一張圓形的圖片以及其所在位置的地圖。

    現在,我們要把這些我們寫好的自定義視圖組合在一起,來完成一個地標的 Detail 視圖的最終設計了!我們要用到的還是已經開始熟悉的那些工具。

    合成視圖的圖像,上面是地圖視圖,下面是公園名稱,中間是圓形圖像視圖。

    Step 1. 在項目導航(Project navigator)中,選擇打開 ContentView.swift 文件。

    ContentView.swift文件內的代碼和預覽截圖

    Step 2. 把之前那個包含三個 Text 的 VStack 用另一個新的 VStack 包裹起來。

    代碼和預覽效果的截圖,在之前的 VStack外面套了一個新的VStack,預覽效果不變

    Step 3. 把我們自定義的 MapView 放到 stack 的頂部,并用 frame(width:height:) 來調整其大小。

    當你只指定了 height(高度)屬性時,視圖會自動把寬度設置成符合內容的。在這里,MapView 會拓展開充滿整個可用空間。

    Step 4. 點擊 Live Preview 按鈕來查看在組合視圖中渲染出來的地圖。

    在顯示 Live Preview 的同時,你也還可以繼續編輯視圖。

    代碼和預覽效果的截圖,添加了MapView

    Step 5. 在 stack 里添加一個 CircleImage。

    代碼和預覽效果的截圖,添加了 CircleImage

    Step 6. 我們要把圖片視圖移到地圖視圖的上層:給它豎直偏移(offset) -130 點,底部內補(padding) -130 點。

    這個調整通過把圖片向上移,來提供給文本更多空間。

    代碼和預覽效果的截圖,移動了圓形圖片

    Step 7. 在最外層的 VStack 的底部增加一個 spacer,把我們的那些內容推到屏幕頂部。

    代碼和預覽效果的截圖,增加來一個 spacer,內容全在屏幕頂部來了

    Step 8. 最后一步,為了能讓我們的地圖拓展到屏幕頂部邊緣(說直白點就是伸到劉海里),給地圖視圖加一個 edgesIgnoringSafeArea(.top) 修飾。


    這一節里,我們完成的主要代碼看上去是這樣的:

    struct ContentView: View {
        var body: some View {
            VStack {
                MapView()
                    .edgesIgnoringSafeArea(.top)
                    .frame(height: 300)
    
                CircleImage()
                    .offset(y: -130)
                    .padding(.bottom, -130)
    
                VStack(alignment: .leading) {
                    Text("Turtle Rock")
                        .font(.title)
                    HStack(alignment: .top) {
                        Text("Joshua Tree National Park")
                            .font(.subheadline)
                        Spacer()
                        Text("California")
                            .font(.subheadline)
                    }
                }
                .padding()
    
                Spacer()
            }
        }
    }
    

    1. combine and layer,我的理解是 combine 在同一水平面組合,layer 做垂直方向上堆放 ?

    2. 本人使用 MacOS Mojave 10.14,所以無法使用預覽的功能,我采取的代替方案是在 Playground 中寫 SwiftUI:一個 Playground 的截圖,圖中寫了一段顯示 Hello SwiftUI 文本的程序,右邊顯示出了預覽 ?

    3. 分享一個讓我很感動的細節,Apple 的文檔里,居然對這樣的一張截圖寫了如此詳細的 alt 說明:Apple文檔的截圖,顯示了 apple 對網頁上的一張圖片寫了特別詳細的 alt 說明 捫心自問,我從來不認真寫 alt,總認為這東西又看不見寫它干嘛!看到了 Apple 的做法,不禁思索,萬一正在閱讀你的文章的人因為網絡、計算機、甚至是視覺問題無法看到這張圖片,我們難道沒有義務為這樣的特殊人群寫一段圖片說明嘛?尤其是對有視覺障礙的人士!以后我會盡可能認真寫 alt!第一步就是——這篇文章翻譯里包括這些 alt! ?

    版權聲明:本文為u012419550原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/u012419550/article/details/106934103

    智能推薦

    SwiftUI重構功能視圖: Never Repeat Yourself!

    1.原來視圖的架構:我們需要監聽一個通知 父VC彈出一個子View,其中子View需要接收父VC發出的通知: [父VC]--------彈出-------->[View] [View]--------監聽-------->[父VC] 由于View的特殊性,我們不能直接將監聽回調放在View本身,而是要另外寫一個類似協調器的東東: 下面是子View的代碼: 看上去貌似很好,不過現在我們需...

    SwiftUI-基礎控件

    一、Rectangle 矩形空間 二、List 1.1創建選擇SwiftUI View  --> StreetRow 1.2  在ContentView...

    SwiftUI Button 基礎教程

    Button 觸發時執行操作的控件 使用教程 您可以通過提供操作和標簽來創建按鈕。操作是一個方法或閉包屬性,當用戶單擊或輕觸按鈕時,它會執行某些操作。標簽是描述按鈕操作的視圖,例如,通過顯示文本(如取消)或圖標(如后退箭頭)。 代碼 iOSButton效果 macOS代碼 tvOS代碼 推薦 基礎文章推薦 《SwiftUI是什么,聽聽大牛們如何說》 經典教程推薦 更新近百篇SwiftUI教程《Sw...

    SwiftUI-基礎使用-1

    參考:SwiftUI 教程 基礎用法 Text Customize the Text View 自定義TextView VCtack:豎向布局 HStack:橫向布局 Spacer:空白 Image Create a Custom Image View 圖片 clipShape 切割方式 Use UIKit and SwiftUI Views Together 將UIKit與SwiftUI結合使用...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡