iOS 視圖與視圖層次結構(內容根據iOS編程)

来源:http://www.cnblogs.com/wang-com/archive/2016/09/11/5862931.html
-Advertisement-
Play Games

視圖基礎 視圖層次結構 任何應用有且只有一個 UIWindow 對象。 UIWindow 對象就像是一個容器,負責包含應用中的所有的視圖。應用需要在啟動時創建並設置 UIWindow 對象,然後為其添加其他視圖。 加入視窗的視圖會成為該視窗的子視圖。視窗的子視圖還可以有自己的子視圖,從而構成一個以  ...


  • 視圖基礎
  1. 視圖是 UIView 對象,或者其子對象。
  2. 視圖知道如何繪製自己。
  3. 視圖可以處理事件,例如觸摸(touch)。
  4. 視圖會按照層次結構排列,位於視圖層次結構頂端的是應用視窗。
  • 視圖層次結構

  任何應用有且只有一個  UIWindow 對象。 UIWindow 對象就像是一個容器,負責包含應用中的所有的視圖。應用需要在啟動時創建並設置 UIWindow 對象,然後為其添加其他視圖。

  加入視窗的視圖會成為該視窗的子視圖。視窗的子視圖還可以有自己的子視圖,從而構成一個以 UIWindow 對象為根視圖的,類似於樹形結構的視圖層次結構。

  視圖層次結構形成之後,系統會將其繪製到屏幕上,繪製過程可以分為兩步:

    1. 層次結構中的每個視圖(包括 UIWindow 對象)分別繪製自己。視圖會將自己繪製到圖層( layer )上,每個 UIView 對象都有一個 layer 屬性,指向一個 CALayer 類的對象

    2. 所有視圖的圖層何曾一幅圖像,繪製到屏幕上。

  獲取當前應用程式的 UIWindow 方法是  UIWindow * keyWindow = [UIApplication sharedApplication].keyWindow; 

  • 創建 UIView 子類

  首先創建一個 UIView 子類。

    視圖及其 frame 屬性

    在控制器中創建一個  CGRect 結構,然後使用該結構創建一個視圖對象,並將這個視圖對象加入到控制器視圖子視圖上。

#import "ViewController.h"
#import "JXHypnosisView.h" // 為創建的子類

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 創建 CGRect 結構
    CGRect rect = CGRectMake(100, 100, 100, 200);
    
    // 創建視圖
    JXHypnosisView * firstView = [[JXHypnosisView alloc] initWithFrame:rect];
    firstView.backgroundColor = [UIColor redColor];
    
    // 將視圖添加到控制器View上
    [self.view addSubview:firstView];

}

@end

顯示結果 

 

   CGRect 結構包含該另外兩個結構: origin 和 size 。其中 origin 的類型是 CGPoint 結構,該結構包含兩個 float 類型測成員。 size 的類型是 CGSize 結構,該結構也包含兩個 float 類型的成員: width 和 height 。

  所以我們創建的視圖對象,在上圖中可以看出  JXHypnosisView 對象的左上角位於父視圖右側 100點 、下方 200點 的位置。此外,因為這個  frame 結構中的 size 是(100,200),所以我們自定義  JXHypnosisView 對象的寬度是 100點 、高度是 200點 。

  我們這裡所說的這些值的單位是 點(points),不是 像素(pixels)如果是像素,那麼在不同的 Retina 顯示屏上顯示的大小是不同的。在  Retina 顯示屏上,一個點是兩個像素高度。(所以在跟美工溝通的時候最好讓他們根據像素來做圖片,並且圖片的像素大小是點的兩倍,或者三倍)。

  每個視圖對象都有一個 superview 屬性。將一個視圖作為子視圖加入另一個視圖時,會自動創建相應的反向關聯。

  • 在  drawRect: 方法中自定義繪圖

  前面我們編寫了一個簡單的自定義的 JXHypnosisView 對象,並且設置了他的一些基本的屬性,如位置,大小,顏色等。在本節中我們將在 drawRect: 方法中編寫繪圖代碼。

  視圖根據 drawRect: 方法將自己繪製到圖層上。 UIView 的子類可以覆蓋 drawRect: 方法完成自定義的繪圖任務。例如, UIButton 的 drawRect: 方法預設會在 frame 表示的矩形區域中心畫出一行淺藍色的文字。

  覆蓋 drawRect: 後首先應該獲取視圖從 UIView 繼承而來的 bounds 屬性,該屬性定義了一個矩形範圍,表示視圖的繪製區域。

  視圖在繪製自己時,會參考一個坐標系, bounds 表示的矩形位於自己的坐標系,而 frame 表示的矩形位於父視圖的坐標系,但是兩個矩形的大小是相同的。

   frame 和 bounds 表示的矩形用法不同。前者用於確定與視圖層次結構中其他視圖的相對位置,從而將自己的圖層與其他視圖的圖層正確組合成屏幕上的圖像。而後者屬性用於確定繪製區域,避免將自己繪製到圖層邊界之外(其視圖是相對於自己而言,設置只有寬高有效)。

  • 繪製圓形

  接下來在 JXHypnosisView 的 drawRect 方法中添加繪圖代碼,畫出一個儘可能大的圓形,但是不能好過視圖的繪製區域。

  首先,需要根據視圖的 bounds 屬性找到繪製預期的中心點:

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
}

@end

  然後再比較視圖的寬和高,將較小的值的一般設置為圓形的半徑:

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);
}

@end
  • UIBezierPath

   UIBezierPath 是用來繪製直線或者曲線的一個類。

  首先要創建一個  UIBezierPath 對象:

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);
    
    UIBezierPath * path = [[UIBezierPath alloc] init];
}

@end

  接下來我們定義  UIBezierPath 對象需要繪製的路徑。

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);
    
    UIBezierPath * path = [[UIBezierPath alloc] init];
    
    // 以中心點為圓心,radius的值為半徑,定義一個 0 到 M_PI * 2.0 弧度的路徑(整圓)
    [path addArcWithCenter:center
                    radius:radius
                startAngle:0.0
                  endAngle:M_PI * 2.0
                 clockwise:YES];
}

@end

  路徑已經定義好了,但是之定義路徑不會進行實際的繪製。我們還需要向 UIBezierPath 對象發送消息,繪製之前定製的路徑:

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);
    
    UIBezierPath * path = [[UIBezierPath alloc] init];
    
    // 以中心點為圓心,radius的值為半徑,定義一個 0 到 M_PI * 2.0 弧度的路徑(整圓)
    [path addArcWithCenter:center
                    radius:radius
                startAngle:0.0
                  endAngle:M_PI * 2.0
                 clockwise:YES];
    
    // 繪製路徑
    [path stroke];
}

@end

  繪製結果:

  現在改變圓形的線條的粗細和顏色。

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);
    
    UIBezierPath * path = [[UIBezierPath alloc] init];
    
    // 以中心點為圓心,radius的值為半徑,定義一個 0 到 M_PI * 2.0 弧度的路徑(整圓)
    [path addArcWithCenter:center
                    radius:radius
                startAngle:0.0
                  endAngle:M_PI * 2.0
                 clockwise:YES];
    
    // 設置線條寬度為 10 點
    path.lineWidth = 10;
    
    // 繪製路徑
    [path stroke];
}

@end

  下麵來改變繪製圖形的軌跡顏色

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);
    
    UIBezierPath * path = [[UIBezierPath alloc] init];
    
    // 以中心點為圓心,radius的值為半徑,定義一個 0 到 M_PI * 2.0 弧度的路徑(整圓)
    [path addArcWithCenter:center
                    radius:radius
                startAngle:0.0
                  endAngle:M_PI * 2.0
                 clockwise:YES];
    
    // 設置線條寬度為 10 點
    path.lineWidth = 10;
    
    // 設置繪製顏色為灰色
    [[UIColor lightGrayColor] setStroke];
    
    // 繪製路徑
    [path stroke];
}

@end

  運行結果:

  這裡我們可以嘗試視圖的 backgroundColor 屬性不會受到 drawRect 中代碼的影響,通常應該將重寫 drawRect 方法的視圖的背景色設置為透明(對應於  clearColor),這樣可以讓視圖只顯示 drawRect 方法中繪製的內容。

#import "ViewController.h"
#import "JXHypnosisView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 創建 CGRect 結構
    CGRect rect = CGRectMake(100, 200, 200, 300);
    
    // 創建視圖
    JXHypnosisView * firstView = [[JXHypnosisView alloc] initWithFrame:rect];
    firstView.backgroundColor = [UIColor redColor];
    NSLog(@"%f",firstView.bounds.origin.x);
    // 將視圖添加到控制器View上
    [self.view addSubview:firstView];

}
#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 設置 JXHypnosisView 對象的背景顏色為透明
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);
    
    UIBezierPath * path = [[UIBezierPath alloc] init];
    
    // 以中心點為圓心,radius的值為半徑,定義一個 0 到 M_PI * 2.0 弧度的路徑(整圓)
    [path addArcWithCenter:center
                    radius:radius
                startAngle:0.0
                  endAngle:M_PI * 2.0
                 clockwise:YES];
    
    // 設置線條寬度為 10 點
    path.lineWidth = 10;
    
    // 設置繪製顏色為灰色
    [[UIColor lightGrayColor] setStroke];
    
    // 繪製路徑
    [path stroke];
}

@end
  • 繪製同心圓 

  在  JXHypnosisView 中繪製多個同心圓有兩個方法,第一個方法是創建多個 UIBezierPath 對象,每個對象代表一個圓形;第二個方法是使用一個 UIBezierPath 對象繪製多個圓形,為每個圓形定義一個繪製路徑。很明顯第二種方法更好。

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 設置 JXHypnosisView 對象的背景顏色為透明
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 根據視圖的寬高比較中的較小的值計算圓形的半徑
    float radius = (MIN(bounds.size.width, bounds.size.height) / 2.0);

// 是最外層圓形成為視圖的外接圓 float maxRadius = hypotf(bounds.size.width, bounds.size.height) / 2.0
; UIBezierPath * path = [[UIBezierPath alloc] init]; // 以中心點為圓心,radius的值為半徑,定義一個 0 到 M_PI * 2.0 弧度的路徑(整圓) [path addArcWithCenter:center radius:radius startAngle:0.0 endAngle:M_PI * 2.0 clockwise:YES];

  for
(float currentRadius = maxRadius; currentRadius > 0; currentRadius -= 20) { [path addArcWithCenter:center radius:currentRadius startAngle:0.0 endAngle:M_PI * 2.0 clockwise:YES]; }
// 設置線條寬度為 10 點 path.lineWidth = 10; // 設置繪製顏色為灰色 [[UIColor lightGrayColor] setStroke]; // 繪製路徑 [path stroke]; } @end

  運行結果:可以看到我們已經畫出了一些列的同心圓,但是屏幕右邊多出了一條奇怪的線條

  這是因為單個 UIBezierPath 對象將多個路徑(每個路徑可以畫出一個圓形)連接起來,形成了一個完成的路徑。可以將 UIBezierPath 對象想象成一支在紙上畫畫的鉛筆-但是當我們繪製完成一個圓形之後去繪製另外一個圓形時,鉛筆並沒有抬起,所以才會出現一條很奇怪的線條。

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 設置 JXHypnosisView 對象的背景顏色為透明
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 是最外層圓形成為視圖的外接圓
    float maxRadius = hypotf(bounds.size.width, bounds.size.height) / 2.0;
    
    UIBezierPath * path = [[UIBezierPath alloc] init];

    for (float currentRadius = maxRadius; currentRadius > 0; currentRadius -= 20) {
        
        // 用來設置繪製起始位置
        [path moveToPoint:CGPointMake(center.x + currentRadius, center.y)];
        
        [path addArcWithCenter:center
                        radius:currentRadius
                    startAngle:0.0
                      endAngle:M_PI * 2.0
                     clockwise:YES];
    }
    
    // 設置線條寬度為 10 點
    path.lineWidth = 10;
    
    // 設置繪製顏色為灰色
    [[UIColor lightGrayColor] setStroke];
    
    // 繪製路徑
    [path stroke];
    
}

@end

  運行結果:完美

  

  • 繪製圖像

  創建一個  UIImage 對象: UIImage * logoImage = [UIImage imageNamed:@"train"]; ,然後在 drawRect 方法中將圖像會知道視圖上: [logoImage drawInRect:someRect] 

#import "JXHypnosisView.h"

@implementation JXHypnosisView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 設置 JXHypnosisView 對象的背景顏色為透明
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    
    CGRect bounds = self.bounds;

    
    // 根據bounds計算中心點
    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    
    // 是最外層圓形成為視圖的外接圓
    float maxRadius = hypotf(bounds.size.width, bounds.size.height) / 2.0;
    
    UIBezierPath * path = [[UIBezierPath alloc] init];

    for (float currentRadius = maxRadius; currentRadius > 0; currentRadius -= 20) {
        
        // 用來設置繪製起始位置
        [path moveToPoint:CGPointMake(center.x + currentRadius, center.y)];
        
        [path addArcWithCenter:center
                        radius:currentRadius
                    startAngle:0.0
                      endAngle:M_PI * 2.0
                     clockwise:YES];
    }
    
    // 設置線條寬度為 10 點
    path.lineWidth = 10;
    
    // 設置繪製顏色為灰色
    [[UIColor lightGrayColor] setStroke];
    
    // 繪製路徑
    [path stroke];
    
    
    // 創建UIImage對象
    UIImage * logoImage = [UIImage imageNamed:@"train"];
    // 繪製圖像
    [logoImage drawInRect:bounds];
    
}

@end
  •  深入學習: Core Graphics 

  UIImage、UIBezierPath 和 NSString 都提供了至少一種用於在  drawRect 中繪圖的方法,這些繪圖的方法會在 drawRect 執行時分別將圖像,圖形,和文本繪製到視圖的圖層上。

  無論是繪製 JPEG 、PDF 還是視圖的圖層,都是由  Core Graphics 框架完成的。 Core Graphics 是一套提供 2D 繪圖功能的 C語言API,使用 C結構和 C函數模擬了一套面向對象的編程機制,並沒有OC對象和方法。 Core Graphics 中最重要的“對象”是 圖形上下文 ,圖形上下文是 CGContextRef 的“對象”,負責存儲繪畫狀態(例如畫筆顏色和線條粗細)和繪製內容所處的記憶體空間。

  視圖的  drawRect  方法在執行之前,系統首先為視圖的圖層創建一個圖形上下文,然後為繪畫狀態設置一些預設參數。 drawRect 方法開始執行時,隨著圖形上下文不斷執行繪圖操作,圖層上的內容也會隨之改變。 drawRect 執行完畢後,系統會將圖層與其他圖層一起組合成完整的圖像並顯示在屏幕上。

  參與繪圖操作的類都定義了改變繪畫狀態和執行繪圖操作的方法,這些方法其實調用了對應的  Core Graphics 函數。例如,向 UIColor 對象發送 setCtroke 消息時,會調用  Core Graphics 中的 CGContextSetRGBSrokeColor 函數改變當前上下文中的畫筆顏色。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 項目是基於平板開發的,設計的界面是要求橫屏展示界面。所以我將所有的Activity都強制設置為橫屏 問題: 主界面,最常見的Activity+n個Fragment 我這裡使用的hide、show Fragment的方式來切換Fragment,當關閉手機、平板屏幕再打開,會發現Fragment ...
  • 1 #import "Cat.h" 2 3 @interface Cat () 4 5 @property (nonatomic, copy) NSString *name; 6 7 @end 8 9 @implementation Cat{ 10 int age; 11 } 12 13 -(ins ...
  • 記錄字元串的處理,不是一個簡單的工作。 NSString是代碼中隨處可見的類型,也是應用和處理繁多的對象,在此只記錄需要常備的方法,並且加以說明。 說明: 1.計算字元串尺寸的方法,sizeWithFont系列方法已經被廢物,建議改為boundingRectWithSize方法;NSAttribut ...
  • 一:原生傳遞參數給React Native 1:原生給React Native傳參 原生給JS傳數據,主要依靠屬性。 通過initialProperties,這個RCTRootView的初始化函數的參數來完成。 RCTRootView還有一個appProperties屬性,修改這個屬性,JS端會調用 ...
  • 前面有同學問到了iOS記憶體警告臨界值和工程項目里AppIcon的一些配置信息,相信對剛入行的同學來說,可能都會碰到類似的問題,記錄一下供後來者查詢。 1、先簡單說下AppIcon的圖標的配置信息 1)、在右邊的App Icon勾選項,暫時只選擇了支持iPhone iOS7.0 and Later, ...
  • 大家看到微信首頁切換效果有沒有覺得很炫,滑動切換,點擊底部bar瞬間切換,滑動切換漸變效果,線上效果圖: 之前也在博客上看到別人的實現,再次基礎上,我做了些優化。首先說下實現原理,大神略過,o(╯□╰)o 頁面上看到的三個頁面是三個Fragment, 左右滑動使用viewpager,相信大家也都是這 ...
  • 一、使用純代碼方式 initWithFrame:中添加子控制項 layoutSubViews中設置子控制項的fame 對外設置數據介面,重寫setter方法給子控制項設置數據顯示 在的viewController裡面使用init/initWithFrame:方法創建自定義類,並且給自定義類的frame賦值 ...
  • 二手交易平臺 我的畢業設計項目安卓源碼,二手交易平臺,dagger2+mvp+Bmob後臺雲搭建,集成了百度地圖,友盟三方登錄等 系統架構 Dagger2+MVP分層,完成了一次正常的retrofit下的天氣信息的請求,其餘請求後臺均基於Bmob雲後臺,圖片在水平方向可滾動 說明 使用請尊重本人技術 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...