【iOS】UI学习(二)

UI学习(二)

  • 进度条和滑动条
  • 步进器与分栏控件
  • 警告对话框和提示等待器
  • UITextField
    • UITextField控件
    • UITextFieldDelegate协议
  • UIScrollView
  • 布局子视图
    • 手动布局子视图
    • 自动布局子视图

进度条和滑动条

下面通过一个程序来讲解该内容

#import <UIKit/UIKit.h>@interface ViewController : UIViewController
{//进度条对象//一般用来表示下载或视频播放的进度UIProgressView* _progressView;//滑动条的定义//一般用来进行调整音乐音量等UISlider* _slider;
}
//定义一个进度条属性
@property (retain, nonatomic) UIProgressView* progressView;
//定义一个滑动条属性
@property (retain, nonatomic) UISlider* slider;@end
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view._progressView = [[UIProgressView alloc] init];//进度条的宽度是固定的,所以第四个参数并没有意义_progressView.frame = CGRectMake(100, 400, 200, 100);//进度条默认为蓝色_progressView.progressTintColor = [UIColor greenColor];_progressView.trackTintColor = [UIColor blackColor];//设置它的进度值_progressView.progress = 0;//设置进度条的风格特征_progressView.progressViewStyle = UIProgressViewStyleDefault;[self.view addSubview:_progressView];_slider = [[UISlider alloc] init];//位置设置,宽度不可变更_slider.frame = CGRectMake(10, 500, 200, 100);//设置滑动条最大值100_slider.maximumValue = 100;//设置滑动条最小值,可以为负值_slider.minimumValue = 0;//设置滑动条的滑块的位置_slider.value = 0;//左侧滑条背景颜色(以滑块为起点)_slider.minimumTrackTintColor = [UIColor greenColor];//右侧滑条背景颜色_slider.maximumTrackTintColor = [UIColor redColor];//设置滑块的颜色_slider.thumbTintColor = [UIColor blueColor];//对滑条移动添加函数[_slider addTarget:self action:@selector(press) forControlEvents:UIControlEventValueChanged];[self.view addSubview:_slider];
}-(void)press
{_progressView.progress = (_slider.value - _slider.minimumValue)/(_slider.maximumValue - _slider.maximumValue);NSLog(@"value = %f", _slider.value);
}@end

效果图
在这里插入图片描述

步进器与分栏控件

#import <UIKit/UIKit.h>@interface ViewController : UIViewController
{//定义步进器对象//按照一定的数字来调整某个数据UIStepper* _stepper;//分栏控制器定义UISegmentedControl* _segControl;
}@property (retain, nonatomic) UIStepper* stepper;
@property (retain, nonatomic) UISegmentedControl* segControl;
@end
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController
@synthesize stepper = _stepper;
@synthesize segControl = _segControl;- (void)viewDidLoad {[super viewDidLoad];//创建步进器对象_stepper = [[UIStepper alloc] init];//宽度是固定的,无法改变_stepper.frame = CGRectMake(100, 100, 100, 40);//设置步进器的最小值_stepper.minimumValue = 0;//设置步进器的最大值_stepper.maximumValue = 100;//设置步进器的当前值_stepper.value = 0;//设置步进器美走一次的value值_stepper.stepValue = 5;//是否将步进结果通过事件函数响应出来//YES:这时会一边执行步进器一边执行事件函数。随着按住的时间越长,执行步进器的速度就越快//NO:这是会执行步进器,只会在松开按钮时执行一次事件函数_stepper.continuous = NO;//当为YES时,按住按钮就会一直执行步进器//NO时,按住按钮只会执行一次步进器_stepper.autorepeat = YES;//添加事件函数[_stepper addTarget:self action:@selector(press) forControlEvents:UIControlEventValueChanged];[self.view addSubview:_stepper];//创建分栏控件对象_segControl = [[UISegmentedControl alloc] init];//宽度仍然不可改变_segControl.frame = CGRectMake(10, 200, 300, 40);//P1:按钮选项文字//P2:按钮的索引位置//P3:是否有插入的动画效果[_segControl insertSegmentWithTitle:@"ak" atIndex:0 animated:NO];[_segControl insertSegmentWithTitle:@"a1" atIndex:1 animated:NO];[_segControl insertSegmentWithTitle:@"a4" atIndex:2 animated:NO];_segControl.selectedSegmentIndex = 1;[self.view addSubview: self.segControl];[_segControl addTarget:self action:@selector(press1) forControlEvents:UIControlEventValueChanged];
}-(void) press
{NSLog(@"Value = %f", _stepper.value);
}-(void) press1
{NSLog(@"%ld", (long)self.segControl.selectedSegmentIndex);
}@end

效果图
在这里插入图片描述

在这里插入图片描述

警告对话框和提示等待器

下面是几个将会用到的方法

  1. UIAlertController 中创建实例的指定初始化程序。该方法会创建具有特定标题、消息和首选样式的警报控制器。
    alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle:
  • title:设置警告框的标题,如果无标题为nil;
  • message:在警告框中显示的内容,无内容的话设置为nil;
  • oreferredStyle:警告控制器的样式。可以是 UIAlertControllerStyleAlertUIAlertControllerStyleActionSheet。前者表示警告控制器以弹出方式显示,后者表示以滑出方式显示。
  1. actionWithTitle是一个iOS开发中的方法,用于创建一个带有标题的动作按钮。
    actionWithTitle:(NSString *)title style:(UIPreviewActionStyle)style handler:(void (^)(UIPreviewAction *action, UIViewController *previewViewController))handler:
  • title:操作的名称
  • style:操作的样式,有UIAlertActionStyleDefault,UIAlertActionStyleCancel, UIAlertActionStyleDestructive三种;

UIAlertActionStyleDefault:表示一个默认的操作,通常为白底蓝字
UIAlertActionStyleCancel:表示一个取消操作,字体通常会做加粗处理
UIAlertActionStyleDestructive:表示一个具有破坏性的操作,通常使用红字。

  • 最后一部分表示执行动作将要执行的块
#import <UIKit/UIKit.h>@interface ViewController : UIViewController {//定义一个警告对话框视图对象UIAlertController* _elertView;//等待提示对象//当下载,或加载比较大的文件时,可以显示此控件,处于提示等待状态UIActivityIndicatorView* _activityIndicator;
}
@property (retain, nonatomic) UIAlertController* elertView;
@property (retain, nonatomic) UIActivityIndicatorView* activityIndicator;
@end
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController
//同步属性和成员变量
@synthesize elertView = _elertView;
@synthesize activityIndicator = _activityIndicator;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//通过for循环定义两个按钮for(int i = 0; i < 2; i++) {UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn.frame = CGRectMake(100, 100 + i * 100, 100, 40);if(i == 0) {[btn setTitle:@"警告对话框" forState:UIControlStateNormal];} else {[btn setTitle:@"等待提示器" forState:UIControlStateNormal];}btn.tag = 100 + i;[btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];}
}-(void) pressBtn:(UIButton*) btn
{//创建警告对话框if(btn.tag == 100) {_elertView = [UIAlertController alertControllerWithTitle:@"警告" message:@"您的手机电量过低,即将关机" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction* action01 = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){/* 在这里编写执行该选项的代码*/}];UIAlertAction* action02 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){/* 在这里编写执行该选项的代码*/}];[_elertView addAction:action01];[_elertView addAction:action02];[self presentViewController:_elertView animated:YES completion:nil];} else if(btn.tag == 101) {//创建等待提示器//宽度和高度不可改变_activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(100, 300, 80, 80)];//设定提示的风格_activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium;//_activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;[self.view addSubview:_activityIndicator];//启动动画并显示[_activityIndicator startAnimating];//停止动画并隐藏//[_activityIndicator stopAnimating];}
}@end

效果图
在这里插入图片描述

UITextField

UITextField控件

定义
UITextField是 iOS 中的一个 UIKit 类,表示单行文本输入字段。它允许用户在应用程序中输入和编辑文本
下面通过代码来演示该程序

#import <UIKit/UIKit.h>@interface ViewController : UIViewController <UITextFieldDelegate>
{UITextField* _textField;
}
@property (retain, nonatomic) UITextField* textField;@end
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.textField = [[UITextField alloc] init];self.textField.frame = CGRectMake(100, 250, 200, 40);self.textField.text = @"用户名";//self.textField.textColor = [UIColor blueColor];//字体的大小self.textField.font = [UIFont systemFontOfSize:24 ];//字体边框的风格//UITextBorderStyleNone:无边框风格//UITextBorderStyleLine:线框风格//UITextBorderStyleBezel:Bezel风格//UITextBorderStyleRoundedRect:圆角风格self.textField.borderStyle = UITextBorderStyleRoundedRect;//设置虚拟键盘的风格//UIKeyboardTypeDefault:默认的风格//UIKeyboardTypeNumberPad:数字和字母结合的风格       //UIKeyboardTypePhonePad:纯数字风格self.textField.keyboardType = UIKeyboardTypeDefault;//当text为空的时候,显示下面的文字self.textField.placeholder = @"请输入用户名...";//是否进行密码输入//YES:隐式输入内容//NO:显示输入内容(默认为NO)self.textField.secureTextEntry = NO;[self.view addSubview:self.textField];self.textField.delegate = self;
}

效果图
在这里插入图片描述

UITextFieldDelegate协议

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{[self.textField resignFirstResponder];NSLog(@"键盘已回收");
}- (void)textFieldDidBeginEditing:(UITextField *)textField
{NSLog(@"开始输入了");
}- (void)textFieldDidEndEditing:(UITextField *)textField
{NSLog(@"结束编译了");
}- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{return YES;
}- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{return YES;
}

注意:必须在viewDidLoad中设置代理对象才能调用以上的函数

self.textField.delegate = self;

结果
在这里插入图片描述

UIScrollView

  • UIScrollView实际上就是一个可以滚动的UIView,它可以左右滚动或者上下滚动。
  • UIScrollView支持平移(水平和垂直滚动)和缩放(捏合缩放)手势,允许用户导航和与内容交互。
  • UIScrollView可以根据开发人员的偏好自动缩放内容以适应可用空间或保持内容的原始大小。
#import <UIKit/UIKit.h>@interface ViewController : UIViewController <UIScrollViewDelegate>
{UIScrollView* _sv;
}@property (retain, nonatomic) UIScrollView* sv;
@end
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController
@synthesize sv=_sv;
- (void)viewDidLoad {[super viewDidLoad];self.sv = [[UIScrollView alloc] init];self.sv.frame = CGRectMake(0, 0, 394, 852);//是否按照整页来滚动视图self.sv.pagingEnabled = NO;//是否可以开启滚动效果self.sv.scrollEnabled = YES;//设置画布的大小,画布显示在滚动视图内部,一般大于frame的大小self.sv.contentSize = CGSizeMake(394, 852 * 5);//是否可以边缘弹动效果self.sv.bounces = NO;//是否开启横向、纵向弹动效果self.sv.alwaysBounceHorizontal = YES;self.sv.alwaysBounceVertical = YES;//显示横向滚动条self.sv.showsHorizontalScrollIndicator = YES;//是否实现纵向滚动条self.sv.showsVerticalScrollIndicator = YES;self.sv.backgroundColor = [UIColor greenColor];//添加图片进去for(int i = 0; i < 5; i++) {NSString* strName = [NSString stringWithFormat:@"%d.JPG", i + 1 ];UIImage* image = [UIImage imageNamed:strName];UIImageView* iView = [[UIImageView alloc] initWithImage:image];iView.frame = CGRectMake(0, 852 * i, 394, 852);[self.sv addSubview:iView];}//将当前视图控制器做为代理对象self.sv.delegate = self;[self.view addSubview:self.sv];
}
//当滚动视图移动时,只要offset坐标发生变化时,都会调用此函数
-(void) scrollViewDidScroll:(UIScrollView *)scrollView
{NSLog(@"y = %f", scrollView.contentSize.width);
}@end

效果图
在这里插入图片描述

布局子视图

我们可以手动或者自动布局子视图。

手动布局子视图

ViewController.h:

#import "ViewController.h"
#import "ViewSuper.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];ViewSuper* sView = [[ViewSuper alloc] init];sView.frame = CGRectMake(20, 20, 120, 200);sView.backgroundColor = [UIColor greenColor];[sView createSubViews];[self.view addSubview: sView];UIButton* btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn1.frame = CGRectMake(300, 480, 80, 40);[btn1 setTitle:@"放大" forState:UIControlStateNormal];[btn1 addTarget:self action:@selector(press1) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview: btn1];UIButton* btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn2.frame = CGRectMake(300, 580, 80, 40);[btn2 setTitle:@"缩小" forState:UIControlStateNormal];btn1.titleLabel.font = [UIFont systemFontOfSize: 32];btn2.titleLabel.font = [UIFont systemFontOfSize: 32];[btn2 addTarget:self action:@selector(press2) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview: btn2];sView.tag = 101;
}-(void) press1
{//放大父视图动画ViewSuper* sView = (ViewSuper*)[self.view viewWithTag:101];[UIView animateWithDuration:1.0 animations:^{sView.frame = CGRectMake(20, 20, 300, 500);}];
}-(void) press2
{//缩小父视图ViewSuper* sView = (ViewSuper*)[self.view viewWithTag:101];[UIView animateWithDuration:1.0 animations:^{sView.frame = CGRectMake(20, 20, 120, 200);}];
}@end

ViewSuper

#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface ViewSuper : UIView
{UIView* _view1;UIView* _view2;UIView* _view3;UIView* _view4;
}-(void) createSubViews;
@end
#import "ViewSuper.h"@implementation ViewSuper- (void)createSubViews {//左上角视图_view1 = [[UIView alloc] init];_view1.frame = CGRectMake(0, 0, 40, 40);//右上角视图_view2 = [[UIView alloc] init];_view2.frame = CGRectMake(self.bounds.size.width - 40, 0, 40, 40);//右下角视图_view3 = [[UIView alloc] init];_view3.frame = CGRectMake(self.bounds.size.width - 40, self.bounds.size.height - 40, 40, 40);//左下角视图_view4 = [[UIView alloc] init];_view4.frame = CGRectMake(0, self.bounds.size.height - 40, 40, 40);_view1.backgroundColor = [UIColor redColor];_view2.backgroundColor = [UIColor redColor];_view3.backgroundColor = [UIColor redColor];_view4.backgroundColor = [UIColor redColor];[self addSubview: _view1];[self addSubview: _view2];[self addSubview: _view3];[self addSubview: _view4];
}- (void)layoutSubviews {[UIView animateWithDuration: 1.0 animations:^ {self->_view1.frame = CGRectMake(0, 0, 40, 40);self->_view2.frame = CGRectMake(self.bounds.size.width - 40, 0, 40, 40);self->_view3.frame = CGRectMake(self.bounds.size.width - 40, self.bounds.size.height - 40, 40, 40);self->_view4.frame = CGRectMake(0, self.bounds.size.height - 40, 40, 40);}];
}@end

效果图
在这里插入图片描述
点击放大后:
在这里插入图片描述

自动布局子视图

自动布局子视图是通过UI自己提供的属性和方法来实现布局子视图。
autoresizingMask属性:这是一个 UIView 属性,允许当父视图的边界发生变化时,视图的大小和位置如何自动调整。
在这里插入图片描述

        [UIView animateWithDuration:1.0 animations:^{self->_superView.frame = CGRectMake(10, 30, 300, 500);}];

这是一个类方法,允许为一个或多个视图的属性变化制作动画。第一个参数是指动画持续的时间,第二个参数此参数是一个包含将要动画化的代码的块(或闭包)。在此块中,您可以修改一个或多个视图的属性,并且这些更改将以动画形式呈现。

代码演示

ViewController:

#import <UIKit/UIKit.h>@interface ViewController : UIViewController
{UIView* _superView;UILabel* _view1;UILabel* _view2;UILabel* _view3;UILabel* _view4;UIView* _viewCenter;
}@end
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];_superView = [[UIView alloc] init];_superView.frame = CGRectMake(20, 50, 180, 300);_superView.backgroundColor = [UIColor redColor];_view1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];_view1.text = @"1";_view1.backgroundColor = [UIColor greenColor];_view2 = [[UILabel alloc] initWithFrame:CGRectMake(180-40, 0, 40, 40)];_view2.text = @"2";_view2.textAlignment = NSTextAlignmentCenter;_view2.backgroundColor = [UIColor greenColor];_view3 = [[UILabel alloc] initWithFrame:CGRectMake(0, 300-40, 40, 40)];_view3.text = @"3";_view3.backgroundColor = [UIColor greenColor];_view4 = [[UILabel alloc] initWithFrame:CGRectMake(180-40, 300-40, 40, 40)];_view4.text = @"4";_view4.backgroundColor = [UIColor greenColor];[_superView addSubview:_view1];[_superView addSubview:_view2];[_superView addSubview:_view3];[_superView addSubview:_view4];_viewCenter = [[UIView alloc] initWithFrame:CGRectMake(0, 0, _superView.bounds.size.width, 40)];_viewCenter.center = CGPointMake(180/2, 300/2);_viewCenter.backgroundColor = [UIColor greenColor];[_superView addSubview: _viewCenter];[self.view addSubview:_superView];_viewCenter.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin;_view2.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;_view3.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;_view4.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin;
}
//每一次触摸屏幕后,就会放大或缩小屏幕
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{static BOOL isLarge = NO;if(isLarge == NO) {[UIView animateWithDuration:1.0 animations:^{self->_superView.frame = CGRectMake(10, 30, 300, 500);}];} else {[UIView animateWithDuration:1.0 animations:^{self->_superView.frame = CGRectMake(20, 50, 180, 300);}];}isLarge = !isLarge;
}@end

效果图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django 里的增删改查

下面是步骤 先更新 urls.py 来添加新的url from django.contrib import admin from django.urls import path from app01 import viewsurlpatterns [path(demo/, views.demo), ]在 models.py 里创建表 from django.db import models# Create your models here. class UserI…

力扣 226. 翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* invertTree(struct Tr…

[leetcode hot150]第五十七题,插入区间

题目&#xff1a; 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示…

62. UE5 RPG 近战攻击获取敌人并造成伤害

在上一篇&#xff0c;我们实现了通过AI行为树控制战士敌人靠近攻击目标触发近战攻击技能&#xff0c;并在蒙太奇动画中触发事件激活攻击的那一刻的伤害判断&#xff0c;在攻击时&#xff0c;我们绘制了一个测试球体&#xff0c;用于伤害范围。 在之前实现的火球术中&#xff0c…

HBuilderX打包uni-app项目成安卓app

目录 1、下载Android 离线SDK 2、Android Studio导入工程 3、生成签名 3.1、进入到jdk bin目录下&#xff0c;输入cmd执行命令keytool -genkey -alias wxsalias -keyalg RSA -keysize 2048 -validity 36500 -keystore wxs.keystore 生成签名 3.2、查看签名密钥keytool -lis…

Simulink从0搭建模型08-P9 While If SwitchCase模块的使用的使用

Simulink从0搭建模型08-P9 While & If & SwitchCase模块的使用的使用 今日学习内容1. While1.1. While Iterator Subsystem模块1.2. 样例11.3. 样例2 2. If2.1. if模块If Action Subsystem模块&#xff08;action) 3. Switch3.1. Switch Case模块3.2. If Action Subsys…

Java实战:文本文件复制

任务目标 本实战任务的目标是创建一个Java程序&#xff0c;用于复制指定的文本文件到另一个位置&#xff0c;并在控制台中显示复制结果。 任务步骤 创建源文件&#xff1a;在指定的路径D:\love.txt创建源文件。创建文件复制类&#xff1a;在net.huawei.student.test包中创建…

成功解决“ModuleNotFoundError: No Module Named Pycocotools”错误的全面指南

成功解决“ModuleNotFoundError: No Module Named Pycocotools”错误的全面指南 在Python的数据科学、计算机视觉和机器学习项目中&#xff0c;经常需要用到各种工具和库来加速开发过程。其中&#xff0c;pycocotools 是一个专门用于处理 COCO 数据集的库&#xff0c;它提供了多…

代理IP如何提高网站的SEO排名

目录 一、代理IP的作用 二、使用代理IP提高SEO排名的几种常见方法 1. 采集数据 2. 提交网站 3. 模拟用户行为 4. 搜索引擎优化 三、合理使用代理IP的注意事项 四、代码示例 总结 代理IP是一种可以隐藏真实IP地址的技术&#xff0c;通过使用代理IP&#xff0c;可以实现…

最大的游戏交流社区Steam服务器意外宕机 玩家服务受影响

易采游戏网6月3日消息&#xff1a;众多Steam游戏玩家报告称&#xff0c;他们无法访问Steam平台上的个人资料、好友列表和社区市场等服务。同时&#xff0c;社区的讨论功能也无法正常使用。经过第三方网站SteamDB的确认&#xff0c;&#xff0c;这一现象是由于Steam社区服务器突…

新奇css模板

引言 (csscoco.com)https://csscoco.com/inspiration/#/./init

ardupilot开发 --- 机载计算机-软件方案 篇

马儿跑马儿不吃草 0. 概述APSyncBlueOSDroneKitFlytOSMaverickROSRpanion-server结论 0. 概述 The Companion Computer software refers to the programs and tools that run on the Companion Computer. They will take in MAVLink telemetry from the Flight Controller and…

Swift 中 @preconcurrency 修饰符使用浅谈

概述 Swift 6.0 与我们越来越近了&#xff0c;如何将旧范儿的并发代码装换为严格遵守 Swift 6.0 并发模型&#xff08; Strict Concurrency&#xff09;的新代码&#xff0c;这往往使得秃头码农们又要多抓掉几根头发了。 所以&#xff0c;为了最大限度的保持新旧两个并发世界暂…

模拟人为操作并获取数据

问题 假设需要获取一个微信公众号h5应用的某些数据&#xff0c;而这个应用存在如下一些反爬措施&#xff0c;从而决定了获取数据的方式。 每一个操作都有类似埋点行为&#xff0c;这样即可收集每个用户的操作轨迹。通过轨迹正常与否&#xff0c;很容易判断一个用户是否在恶意获…

【Spring Cloud Alibaba】开源组件Nacos及安装与配置

目录 什么是NacosNacos的关键特性服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元数据管理 Nacos的架构Nacos的用户Nacos的安装预备环境准备安装方式有两种&#xff1a;源码安装和下载编译好的安装包Nacos 支持三种部署模式&#xff0c;分别是单机、集群和多集群。…

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时&#xff0c;前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API&#xff0c;实现前端渲染性能飙升 50% 的突破&#xff01;除此之外&#xff0c;我们一同探究下该库还支持哪些新的特性…

【Git篇 二】idea中使用git合并分支(拉取分支)

idea中使用git合并分支 前言idea使用git合并分支1) 将主分支&#xff08;master&#xff09;更新到自己的分支&#xff08;dev&#xff09;① checkout到自己分支② 目标分支&#xff08;dev&#xff09;更新到当前分支&#xff08;dev_KC240524&#xff09;③ 当前分支出现“绿…

【Python】 Python网络请求库大比拼:urllib、urllib2、urllib3与requests

基本原理 在Python中&#xff0c;进行网络请求是常见的任务之一&#xff0c;无论是下载网页内容、获取API数据还是进行文件上传。Python社区提供了多种库来帮助开发者完成这些任务。其中&#xff0c;urllib、urllib2、urllib3和requests是最为流行的几个。了解它们之间的区别对…

促进设备缺陷闭环管理,引入智能巡检系统正当时

经过近些年的应用与发展&#xff0c;智能巡检系统的功能与可操作性已经非常成熟&#xff0c;在巡检工作整合管理、与其他系统调用对接、促进设备缺陷闭环管理方面的优秀表现&#xff0c;使其在安全管理工作中的发挥了超预期的工具价值。 一、巡检工作整合管理 设备巡检管理、安…

QT 编译Lua 动态库,使用Lua脚本混合编程

一,编译Lua动态库 1,下载lua源码 地址:Lua: downloadhttps://www.lua.org/download.html 2,配置 解压lua源码压缩包,里面有个src文件夹,里面的代码就是lua的源码