iOS的屏幕适配之Autoresizing、Autolayout、VFL、Masonry

VLOOKUP_fixed.py 立即下载

一、苹果产品的发行

机型预装系统iPhone发行时间对应Xcode
iPhone4iOS 42010年06月08日Xcode3+
iPhone4SiOS 52011年10月04日Xcode4 (4.0收费,引入ARC)
iPhone5iOS 62012年09月21日Xcode4+ (4.1之后免费,引入Autolayout)
iPhone5SiOS 72013年09月20日Xcode5
iPhone 6/6 PlusiOS 82014年10月10日Xcode6
iPhone 6S/6S PlusiOS 92015年09月10日Xcode7

二、设备的分辨率

设备尺寸像素点
iPhone \ iPhone 3G \ iPhone 3GS3.5 inch320 x 480320 x 480
iPhone 4 \ iPhone 4S3.5 inch640 x 960320 x 480
iPhone 5 \ iPhone 5C \ iPhone 5S4.0 inch640 x 1136320 x 568
iPhone64.7 inch750 x 1334375 x 667
iPhone6 plus5.5 inch1242 x 2208414 x 736
iPad \ iPad29.7 inch768 x 1024768 x 1024
iPad 3(The new iPad) \ iPad4 \ iPad Air9.7 inch1536 x 2048768 x 1024
iPad Mini7.9 inch768 x 1024768 x 1024
iPad Mini 2(iPad Mini with retina display)7.9 inch1536 x 2048768 x 1024

三、屏幕适配

  1. iPhone4S之前没有屏幕适配,因为屏幕尺寸不变,全部用frame、bounds、center进行布局。
  2. iphone5之后才开始有屏幕适配。

四、Autoresizing

  1. iPad的出现和iPhone横屏的出现,出现Autoresizing技术
  2. Autoresizing让横竖屏适配相对于用frame、bounds、center进行布局简单
  3. 使用Autoresizing的前提是:关闭Autolayout功能;因为有些功能重复
  4. 局限性
    - 只能解决子控件跟父控件的相对关系问题
    - 不能解决兄弟控件的相对关系问题
  5. 当控件的的autoresizesSubviews是YES时,(默认是YES),那么UIView对象的子控件会根据子控件自身的autoresizingMask属性值来自动适应与其父控件之间的位置和大小
  6. storyboard或xib下使用Autoresizing,宽高和宽度的自动调整:实线代表选中,左右上下间距的自动调整:虚线代表选中


    关闭自动布局


这里写图片描述


  1. 纯代码使用Autoresizing
---------- UIViewAutoresizing类型,有两个尖号<<代表可以复选,复选用竖杠隔开

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    //不自动调整
    UIViewAutoresizingNone                 = 0,
    //自动按与父控件比例调整与父控件左边的距离,且与父控件右边的距离不变
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    //自动按与父控件比例调整与父控件的右边距离,且与父控件左边的距离不变
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    //自动按与父控件比例调整与父控件的顶部距离,且与父控件底部的距离不变
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    //自动按与父控件比例调整与父控件的底部距离,且与父控件顶部的距离不变
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
    //自动与父控件按比例调整宽度
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    //自动与父控件按比例调整高度
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
};

---------- Autoresizing的使用 

#import "ViewController.h"

@interface ViewController ()


@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  //创建控件,做为父控件
  UIView *viewSuper = [[UIView alloc] initWithFrame:CGRectMake(40, 50, 200, 200)];
  viewSuper.backgroundColor = [UIColor greenColor];
  [self.view addSubview:viewSuper];
  //创建控件,做为子控件
  UIView *viewSub = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 50, 100)];
  viewSub.backgroundColor = [UIColor orangeColor];
  [viewSuper addSubview:viewSub];

  //autoresizesSubviews的默认值为YES
  //当值为NO时,不会根据子控件的autoresizingMask属性值来自动调整
  //viewSuper.autoresizesSubviews = NO;

  //自动按照比例调整与父控件的左间距和自动按比例调整宽度
  viewSub.autoresizingMask =   UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth;

}

//随机改变父控件的宽高,测试调整效果
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  //arc4random_uniform()是取随机数
  CGFloat w = 200 + arc4random_uniform(100);
  CGFloat h = 200 + arc4random_uniform(100);
  [[self.view.subviews lastObject] setFrame:CGRectMake(40, 40, w, h)];
}

@end

五、Autolayout
(一).Autolayout的2个核心概念
1.参照:参照是指一个约束是根据那个控件来计算约束的,做为参照的控件位置和尺寸大小必须明确
2.约束:约束相当于控件的Frame,用来明确控件所处的位置和控件的的尺寸大小

(二).Autolayout核心计算公式
约束的计算方法:obj1.property =(<=或>=)(obj2.property * multiplier)+ constant
解析:
=: 等号可以根据需求改为:小于等于或大于等于
obj1:控件
property:左边线,右边线,垂直中心线,上边线,下边线,水平中心线,高度,宽度等的约束值
multiplier:倍数
constant:偏移量

(二).注意:
1.约束的本质:用来明确控件所处的位置和控件的的尺寸大小
2.约束和Frame类似,Frame也是用来确定位置和尺寸的大小
3.给一个控件加约束,要么不加,要么加全了;只要给控件添加一个约束,就要加全必要约束,要让控件明确的知道它自己的尺寸和所处的位置,苹果鼓励开发者尽量用Autolayout,忘掉Frame
4.Updata Frames:设置约束后更新Frame;如果约束不全,更新之后控件就会找不到
5.控件UILable很特殊,只约束它的位置,不约束尺寸大小,系统会自动添加宽度和高度约束,这个特性可以用于设置lable的宽度或高度随内容的变化而变化

(三).storyboard和xib下的设置

1.Autolayout的警告和错误
(1).警告
控件的frame不匹配所添加的约束
比如:约束控件的宽度为100, 而控件现在的宽度是110
(2).错误
a.缺乏必要的约束
比如:只约束了宽度和高度, 没有约束具体的位置
b.两个约束冲突
比如:1个约束控件的宽度为100, 1个约束控件的宽度为110

2.添加约束时,系统会自动以Top Layout Guide和Bottom Layout Guide两条线做为约束的参照物,这两天线是系统自动创建时就添加的
这里写图片描述


这里写图片描述


3.约束的属性面板:可以在这个面板修改约束
这里写图片描述


4.Constrain to margins:选中就默认在左右两边各加上16个像素
这里写图片描述


5.更新约束(一)
(1).成功添加就就马上更新
这里写图片描述


(2.)手动更新
这里写图片描述


6.拖拽添加约束
这里写图片描述


这里写图片描述


(四).代码实现Autolayout
1.实现步骤
(1).先禁止autoresizing功能,设置view的下面属性为NO

view.translatesAutoresizingMaskIntoConstraints = NO;

(2).利用NSLayoutConstraint类创建具体的约束对象
创建约束对象的常用方法:

+(instancetype)constraintWithItem:(id)view1 
                        attribute:(NSLayoutAttribute)attr1 
                        relatedBy:(NSLayoutRelation)relation 
                           toItem:(id)view2 
                        attribute:(NSLayoutAttribute)attr2 
                       multiplier:(CGFloat)multiplier 
                         constant:(CGFloat)c;
/**
解析:
     view1 :要约束的控件
     attr1 :约束的类型(上、下、左、右、顶部、底部)
  relation :与参照控件之间的关系(=、<=或>=)
     view2 :参照的控件
     attr2 :约束的类型(上、下、左、右、顶部、底部)
multiplier :乘数
         c :常量
计算公式:attr1 =(<=或>=) attr2 * multiplier + c
**/

(3).添加约束对象到相应的view上

- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)addConstraints:(NSArray *)constraints;

2.添加约束的规则
(1).对于两个同层级view之间的约束关系,添加到它们的父view上
这里写图片描述


(2).对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上
这里写图片描述


(3).对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上
这里写图片描述


3.注意
(a).要先禁止autoresizing功能,设置view的translatesAutoresizingMaskIntoConstraints属性为NO;不然系统会自动把Autoresizing的值转换成约束
(b).添加约束之前,一定要保证相关控件都已经在各自的父控件上
(c).不用再给view设置frame
(d).添加约束不要添加错了控件
(e).一般报错原因是:约束冲突或者约束不完整
4.编程举例

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  //创建一个蓝色的View,不用设置Frame,设置了可能会起冲突
  UIView *blueView = [[UIView alloc] init];
  blueView.backgroundColor = [UIColor blueColor];
  //必须要设置为NO,默认是YES,在YES的时,系统会自动把Autoresizing的值转换成约束
  blueView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview: blueView];

  //创建一个红色的View,不用设置Frame,设置了可能会起冲突
  UIView *redView = [[UIView alloc] init];
  redView.backgroundColor = [UIColor redColor];
  //必须要设置为NO,默认是YES,在YES的时,系统会自动把Autoresizing的值转换成约束
  redView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:redView];


#pragma mark - 设置蓝色的约束

  //给蓝色View添加约束:顶部距离父控件上边框50像素
  NSLayoutConstraint *blueTopLayout = [NSLayoutConstraint
                                       constraintWithItem:blueView
                                                attribute:NSLayoutAttributeTop
                                                relatedBy:NSLayoutRelationEqual
                                                   toItem:self.view
                                                attribute:NSLayoutAttributeTop
                                               multiplier:1.0
                                                 constant:50];
  [self.view addConstraint:blueTopLayout];

  //给蓝色View添加约束:左边距离父控件左边框180像素
  NSLayoutConstraint *blueLeftLayout = [NSLayoutConstraint
                                        constraintWithItem:blueView
                                                 attribute:NSLayoutAttributeLeft
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self.view
                                                 attribute:NSLayoutAttributeLeft
                                                multiplier:1.0
                                                  constant:80];
  [self.view addConstraint:blueLeftLayout];

  //给蓝色View添加约束:宽度为100个像素
  NSLayoutConstraint *blueWidthLayout = [NSLayoutConstraint
                                         constraintWithItem:blueView
                                                  attribute:NSLayoutAttributeWidth
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:nil
                                                  attribute:NSLayoutAttributeNotAnAttribute
                                                 multiplier:0.0
                                                   constant:100];
  [blueView addConstraint:blueWidthLayout];

  //给蓝色View添加约束:高度为100个像素
  NSLayoutConstraint *blueHeightLayout = [NSLayoutConstraint
                                          constraintWithItem:blueView
                                                   attribute:NSLayoutAttributeHeight
                                                   relatedBy:NSLayoutRelationEqual
                                                      toItem:nil
                                                   attribute:NSLayoutAttributeNotAnAttribute
                                                  multiplier:0.0
                                                    constant:100];
  [blueView addConstraint:blueHeightLayout];


#pragma mark - 设置红色的约束

  //给红色View添加约束:宽度为100个像素
  NSLayoutConstraint *redWidthLayout = [NSLayoutConstraint
                                        constraintWithItem:redView
                                                 attribute:NSLayoutAttributeWidth
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:nil
                                                attribute:NSLayoutAttributeNotAnAttribute
                                               multiplier:0.0
                                                 constant:100];

  //给红色View添加约束:高度为100个像素
  NSLayoutConstraint *redHeightLayout = [NSLayoutConstraint
                                         constraintWithItem:redView
                                                  attribute:NSLayoutAttributeHeight
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:nil
                                                  attribute:NSLayoutAttributeNotAnAttribute
                                                 multiplier:0.0
                                                   constant:100];

  //用数组的方式批量添加约束
  [redView addConstraints:@[redWidthLayout,redHeightLayout]];

  //给红色View添加约束:红色的左边线距离蓝色的右边线距0个像素
  NSLayoutConstraint *redLeftLayout = [NSLayoutConstraint
                                       constraintWithItem:redView
                                                attribute:NSLayoutAttributeLeft
                                                relatedBy:NSLayoutRelationEqual
                                                   toItem:blueView
                                                attribute:NSLayoutAttributeRight
                                               multiplier:1.0
                                                 constant:0];

  //给红色View添加约束:红色的上边线与蓝色的上边线对齐
  NSLayoutConstraint *redTopLayout = [NSLayoutConstraint
                                         constraintWithItem:redView
                                                  attribute:NSLayoutAttributeTop
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:blueView
                                                  attribute:NSLayoutAttributeTop
                                                 multiplier:1.0
                                                   constant:0];

  //用数组的方式批量添加约束
  [self.view addConstraints: @[redLeftLayout,redTopLayout]];

}

@end

六、VFL语言
1.VFL全称是Visual Format Language,翻译过来是“可视化格式语言”
2.VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言
3.语法
(1).语法列表

表达式功能
v:表示垂直
H:表示水平
|表示父控件的边框,前面是V:就代表垂直方向的父控件边框,前面是H:就代表水平方向的父控件边框,竖线前面没有V:和H:默认是水平方向,如 |[redView]表示redView紧贴父控件的左边框
-表示一个小间隔或表示距离,如:V:|-20- 表示距离顶部20像素,|-[redView]表示redView距离父控件的左边框有一个小间隔
( )括号里可以写控件名,如:H:|-[button1(button)]表示button1与button等宽;也可以写H:|-[button(==30)]表示button宽等于30像素
[]方括号里表示写控件名,[button]表示button控件;H:[button1][button2]表示两个控件水平紧贴着
@value表示优先级别,如: H:[button(>=50@800)] 表示button宽度大于等于50像素,该约束条件优先级为800(优先级最大值为1000,优先级越高的约束越先被满足)

(2).举例
H:[cancelButton(72)]-12-[acceptButton(50)]
canelButton宽72,acceptButton宽50,它们之间间距12

H:[wideView(>=60@700)]
wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)

V:[redBox][yellowBox(==redBox)]
竖直方向上,先有一个redBox,其下方紧接一个高度等于redBox高度的yellowBox

H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|
水平方向上,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线“|” 表示superview的边缘)
4.使用VFL语言设置约束的步骤
(1).用VFL语言创建VFL语句,用字符串表示
(2).把VFL语句中包含的数值或控件用字典表示

//创建一个字典(内部包含VFL语句中用到的控件)的快捷宏定义
NSDictionary *dic = NSDictionaryOfVariableBindings(…);

(3).使用VFL来创建约束数组的常用方法

+ (NSArray *)constraintsWithVisualFormat:(NSString *)format 
                                 options:(NSLayoutFormatOptions)opts 
                                 metrics:(NSDictionary *)metrics 
                                   views:(NSDictionary *)views;
/**
解析
 format :VFL语句
   opts :约束类型,一般写kNilOptions,表示空选项
metrics :VFL语句中用到的具体数值
  views :VFL语句中用到的控件
**/

(4).把约束数组添加到对应的控件中

- (void)addConstraints:(NSArray *)constraints;

5.代码举例

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  //创建一个蓝色的View,不用设置Frame
  UIView *blueView = [[UIView alloc] init];
  blueView.backgroundColor = [UIColor blueColor];
  //必须要设置为NO,默认是YES,在YES的时,系统会自动把Autoresizing的值转换成约束
  blueView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview: blueView];

  //水平方向下:控件blueView的宽度等于100像素,左右边距为默认一个小间距
  NSString *vfl1 = @"H:|-[blueView(==100)]-|";
  NSDictionary *ditViews1 =  NSDictionaryOfVariableBindings(blueView);
  NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:vfl1 options:kNilOptions metrics:nil views:ditViews1];
  [self.view addConstraints:constraints];

  //垂直方向下:控件blueView距左边距50个像素,高度等于100像素,右边距为默认一个小间距
  NSNumber *n = @100;
  NSString *vfl2 = @"V:|-50-[blueView(==n)]-|";
  NSDictionary *metrics =  NSDictionaryOfVariableBindings(n);
  NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:vfl2 options:kNilOptions metrics:metrics views:ditViews1];
  [self.view addConstraints:constraints2];

}
@end

6.有用到Frmae属性的控件,不用把translatesAutoresizingMaskIntoConstraints属性设置为NO,设置为NO后,Frame将不起作用,值为0

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  //创建一个蓝色的View
  UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 200, 200)];
  blueView.backgroundColor = [UIColor blueColor];
  //如果控件不设置约束,而是直接使用Frame,就不用设置属性为NO
  blueView.translatesAutoresizingMaskIntoConstraints = YES;
  [self.view addSubview: blueView];

  //创建一个红色的View,不用设置Frame
  UIView *redView = [[UIView alloc] init];
  redView.backgroundColor = [UIColor redColor];
  //必须要设置为NO,默认是YES,在YES的时,系统会自动把Autoresizing的值转换成约束
  redView.translatesAutoresizingMaskIntoConstraints = NO;
  [blueView addSubview:redView];

  //redView与父控件的左右边距各为一个小间隔
  NSString *vflH = @"|-[redView]-|";
  NSDictionary *dic = NSDictionaryOfVariableBindings(redView);
  NSArray *constraints1 = [NSLayoutConstraint constraintsWithVisualFormat:vflH options:kNilOptions metrics:nil views:dic];
  [blueView addConstraints:constraints1];

  //redView紧贴父控件的上边框,高度为100
  NSString *vflV = @"V:|[redView(==100)]";
  NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:vflV options:kNilOptions metrics:nil views:dic];
  [blueView addConstraints:constraints2];

}
@end

七、Masonry
(一).简介
1.目前最流行的Autolayout第三方框架
2.用优雅的代码方式编写Autolayout
3.省去了苹果官方Autolayout长代码

(二).添加约束的类型
1.尺寸:width\height\size
2.边界:left\leading\right\trailing\top\bottom
3.中心点:center\centerX\centerY
4.边界:edges

(三).添加约束的方法
1.mas_makeConstraints:这个方法只会添加新的约束
2.mas_updateConstraints:这个方法将会覆盖以前的某些特定的约束
3.mas_remakeConstraints:这个方法会将以前的所有约束删掉,添加新的约束

(四).注意
1.创建的控件时不用再把控件的translatesAutoresizingMaskIntoConstraints属性设置为NO,框架里已经封装
2.equalTo方法不会对数据进行包装
3.mas_equalTo方法会对参数进行包装
4.multipliedBy表示乘数
5.offset:这个方法代表偏移量,正表示往下或往右移动,负表示往上或往左移动
6.当只对宽高进行约束,不对位置约束时,位置默认在父控件的左上角
7.只要添加了#define MAS_SHORTHAND这个宏,就不用带mas_前缀
8.只要添加了#define MAS_SHORTHAND_GLOBALS这个宏,equalTo就等价于mas_equalTo
9.#define MAS_SHORTHAND 和 #define MAS_SHORTHAND_GLOBALS 一定要添加到#import “Masonry.h”上面,因为Masonry.h里面的代码要用到这两个宏

(五).代码举例
下面代码中,每一个添加约束的方法都可以独立完整的添加约束,可以挨个进行测试

#import "ViewController.h"

//define this constant if you want to use Masonry without the 'mas_' prefix
#define MAS_SHORTHAND
//define this constant if you want to enable auto-boxing for default syntax
#define MAS_SHORTHAND_GLOBALS

#import "Masonry.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  //创建一个红色视图
  UIView *redView = [[UIView alloc] init];
  redView.backgroundColor = [UIColor redColor];
  [self.view addSubview:redView];

  //mas_makeConstraints:这个方法只会添加新的约束
  [redView mas_makeConstraints:^(MASConstraintMaker *make) {

    //equalTo:这个方法不会对参数进行包装,
    make.width.equalTo(@100);

    //mas_equalTo:这个方法会对参数进行包装
    make.width.mas_equalTo(100);

    //offset:这个方法代表偏移量,正表示往下或往右移动,负表示往上或往右移动
    make.top.equalTo(self.view).offset(100);
    make.right.equalTo(self.view.mas_left).offset(200);

  }];

  //mas_updateConstraints:这个方法将会覆盖以前的某些特定的约束
  [redView mas_updateConstraints:^(MASConstraintMaker *make) {

    //size:设置宽和高的约束
    make.size.equalTo([NSValue valueWithCGSize:CGSizeMake(50, 50)]);

    //make.size.mas_equalTo(CGSizeMake(200 , 200));

  }];

  //mas_remakeConstraints:这个方法会将以前的所有约束删掉,添加新的约束
  [redView mas_remakeConstraints:^(MASConstraintMaker *make) {

    //redView高等于父控件的0.5倍,在加上10个像素
    make.height.equalTo(self.view.mas_height).multipliedBy(0.5).offset(10);
    //redView宽等于父控件的0.5倍,在减去10个像素
    make.width.mas_equalTo(self.view.mas_width).multipliedBy(0.5).offset(-10);

  }];

  //mas_remakeConstraints:这个方法会将以前的所有约束删掉,添加新的约束
  [redView mas_remakeConstraints:^(MASConstraintMaker *make) {

    //距离父控件四周都是50间距
    make.edges.mas_equalTo(self.view).insets(UIEdgeInsetsMake(50, 50, 50, 50));

  }];

  //mas_remakeConstraints:这个方法会将以前的所有约束删掉,添加新的约束
  [redView mas_remakeConstraints:^(MASConstraintMaker *make) {

    make.width.equalTo(@150);
    make.height.mas_equalTo(150);
    //redView的中心在父控件的中心
    make.center.mas_equalTo(self.view).insets(UIEdgeInsetsZero);

  }];

  //mas_remakeConstraints:这个方法会将以前的所有约束删掉,添加新的约束
  [redView mas_remakeConstraints:^(MASConstraintMaker *make) {

    //必须要在文件开头添加 #define MAS_SHORTHAND 和 #define MAS_SHORTHAND_GLOBALS
    //才能在equalTo中用基本数据类型的数据,宏定义会自动包装基本数据类型的数据
    make.width.equalTo(100);
    make.height.equalTo(100);
    make.centerX.equalTo(self.view.centerX);
    make.centerY.equalTo(self.view.centerY);

  }];

}

@end
D打卡签到,蓝牙中继,广播信号模拟器 模拟WIFI或蓝牙,有如下4种运行模式 1、WIFI模式:指定SSID、BSSID名称等,模拟WIFI,供设备连接。 2、蓝牙静态模式:指定MAC地址,广播固定的RAW数据。 3、蓝牙动态主机模式:扫描周围蓝牙设备,获取指定MAC地址的蓝牙及其RAW数据,实时发送至Cloud云端,可以设定时间段,只在设定的时间段内发送。 4、蓝牙动态从机模式:指定MAC地址,从Cloud云端获取动态主机模式实时上传的该MAC地址的RAW数据,并广播RAW数据。 准备工作: 1、板子:选择ESP32C3或ESP32C3 Supermini 2、nRF Connect手机app:用于扫描获取待模拟蓝牙设备的MAC和RAW数据。 Wifi分析仪或WiFi魔盒手机APP:用于扫描获取待模拟WIFI设备的SSID和BSSID。 3、可使用官方flash_download_tool_3.9.11工具来固件烧录。 使用说明: 上述完成后,设备首次上电,RESET一侧的指示灯会常亮,可以把它理解成电源指示灯; BOOT一侧的灯会亮,该灯常亮,表示设备开启了AP模式,此时设备会发射一个WIFI信号源,名称为ESPWIFI_AP,密码为12345678,手机或电脑连接该WIFI,浏览器输入192.168.4.1,进入设备的配置页面,进行相应的配置,其中动态主机模式和动态从机模式的SSID、Pwd 及要模拟的蓝牙MAC地址。配置完成并保存后,会重启,重启后设备会按照保存的配置运行。若下次要修改设备配置,可以长按BOOT按键,等待BOOT一侧的灯常亮,即进入AP模式,再按照上述流程配置即可。 仅用于蓝牙设备的开发与调试,请勿用于签到等违法违纪用途。 立即下载

相关推荐

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

iOS适配,iOS自动布局的几种高级用法(autoresizing,Masonry)

熟悉iOS开发的人,可能都知道,iOS6出来以后,autolayout自动布局就出现了,但是刚开始大家都不怎么用,直到iPhone 5s、iPhone6出来后,屏幕变得越来越多样,单纯用if来判断尺寸已完全不能满足了,自动布局才逐渐走进程序猿的编程代码中。Autolayout自动布局为什么能被大家所常用呢?可能大家都知道之前有一个自动伸缩的autoresizing属性,主要适...

a524389222的博客 1215

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

IOS自动布局之Autoresizing

IOS自动布局之Autoresizing 对于IOS的app开发者来说,不会像Android开发者一样为很多的屏幕尺寸来做界面适配,因此硬编码的坐标也能工作良好,但是从设计模式上来说这不是好的做法。而且也还有一些问题,如iPhone5的适配,横竖屏的切换等。或许你可以做两套UI方案来做适配,但是这样增加重复工作量,而且不够高端,万一有出新的屏幕大小了呢。哲理就将介绍IOS中的两大自动布局

yongyinmg的专栏 2万+

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型等

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 Spring Boot, MyBatis, Flowable, TypeScript, Vue, Antdv, 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型、代码生成器等

文创媒体电商行业智算中心(AIDC)建设规划方案.pptx

文创媒体电商行业智算中心(AIDC)建设规划方案.pptx

iOS 新建xib取消autolayout

通过创建xCode文件模板的方式--> 修改默认xib模板文件即可。 创建xCode模板的方法看这个链接 http://www.bobmccune.com/2012/03/04/creating-custom-xcode-4-file-templates/  本文参考点击打开链接

for_users的专栏 2895

集团企业数字化转型AI智能体平台规划及场景应用方案.pptx

集团企业数字化转型AI智能体平台规划及场景应用方案.pptx

iOS自动布局-VFL格式约束

AutoLayout VFL可视化格式约束 一、VFL简介 iOS的自动布局约束主要有三种方式, 1.可视化界面中添加布局,比如在Storyboard xib。 2.代码添加当个约束 3.VFL格式约束 VFL添加约束的优点 1.可以一行代码添加多个约束和多个对象 2.动态性大 3.不依赖其他框架。 4.只需要直观的从垂直和水平方向考虑 现在在代码添加约束中有很多优秀...

小桥流水哗啦啦,iOS Coder 哒哒哒 1548

基于动态窗口法DWA的机器人路径规划研究(Matlab代码实现)

内容概要:本文系统研究了基于动态窗口法(DWA)的机器人局部路径规划算法,深入剖析其在动态环境中实现自主避障与实时轨迹优化的核心机制。文章详细阐述了DWA算法的速度空间采样策略、轨迹预测模型、动力学约束处理及多目标代价函数的设计原理,并通过构建完整的Matlab仿真框架验证算法有效性。结合典型场景的仿真实验,展示了机器人在复杂障碍物环境下如何实时生成安全、平滑且符合运动学约束的最优路径,充分体现了DWA在移动机器人导航中的实用性与鲁棒性。; 适合人群:具备机器人运动规划基础知识和Matlab编程能力,从事智能移动机器人、自动驾驶或服务机器人研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解DWA算法的理论基础与实现细节;②掌握机器人局部路径规划的仿真实现方法;③为实际机器人系统的导航模块开发提供可复用的算法原型与代码参考;④作为进一步研究高级导航算法(如TEB、MPC)的技术基础。; 阅读建议:建议结合提供的Matlab代码逐模块分析与调试,重点关注速度采样、轨迹积分、障碍物距离计算及代价评估等关键环节,通过调整参数在不同地图环境中进行对比实验,以深刻把握算法性能与参数之间的关系,进而提升对实时路径规划系统设计的理解与应用能力。

【轴承故障诊断】用于轴承故障诊断的集中时频分析研究(Matlab代码实现)

内容概要:本文系统研究了用于轴承故障诊断的集中时频分析技术,重点解决了传统时频分析方法在处理非平稳信号时存在的能量分散与分辨率不足等问题。通过引入集中时频分析方法,能够有效聚焦信号能量,精确提取轴承故障特征频率,提升故障识别的准确性与时效性。文章详细阐述了该方法的理论基础,并结合仿真信号与实际实验数据验证其优越性能,同时提供了完整的Matlab代码实现流程,涵盖信号预处理、时频变换、参数优化及结果可视化等环节,便于读者复现与拓展应用。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事机械设备状态监测、故障诊断与预测性维护工作的工程技术人员。; 使用场景及目标:①应用于电机、风机、齿轮箱等旋转机械的早期轴承故障检测,实现故障预警;②提升工业设备运维系统的智能化水平,支撑预测性维护体系构建;③作为高校或研究机构在信号处理、机械故障诊断等课程中的教学案例与实践素材。; 阅读建议:建议读者结合文中提供的Matlab代码逐段运行与调试,深入理解集中时频分布的生成机制及其关键参数(如核函数选择、平滑窗口大小)对诊断效果的影响,并尝试将其应用于其他类型的机械故障信号分析中,开展对比研究以深化对该方法适用性的认识。

iOS开发——UI基础-屏幕适配

一、适配 1.什么是适配?适应、兼容各种不同的情况 2.移动开发中,适配的常见种类 2.1系统适配 针对不同版本的操作系统进行适配 2.2屏幕适配 针对不同大小的屏幕尺寸进行适配 二、点和像素 1.在用户眼中屏幕是由无数个像素组成的像素越多,屏幕越清晰 2.在开发者眼中屏幕是由无数个点组成的,点又是由像素组成的像素越多,屏幕越清晰 ...

weixin_30326515的博客 276

python使用TensorRT报错,多线程或多进程中使用问题

python使用TensorRT报错,Cuda Runtime问题

qq_44224801的博客 747

iOS - AutoLayout

前言 NS_CLASS_AVAILABLE_IOS(6_0) @interface NSLayoutConstraint : NSObject @available(iOS 6.0, *) public class NSLayoutConstraint : NSObject 1)Autolayout 在 Autolayout 之前,有 Autoresizing ...

weixin_30276935的博客 127

实战演练:基于Veristand Custom Device的硬件在环(HIL)数据流控制模块开发

本文详细介绍了基于Veristand Custom Device的硬件在环(HIL)数据流控制模块开发实战。通过LabVIEW环境配置、动态路由逻辑构建、实时处理核心开发及性能优化等关键步骤,帮助工程师快速掌握定制化HIL测试系统的开发技巧,提升测试效率与准确性。

weixin_29206669的博客 475

【计算机视觉】pyrealsense2:Intel RealSense 深度相机的 Python 接口实战指南

pyrealsense2:Intel RealSense 深度相机的 Python 接口实战

weixin_43988131的博客 4350

Autolayout

Autolayout Autolayout是一种“自动布局”技术,专门用来布局UI界面的 Autolayout自iOS6开始引入,由于Xcode4的不给力,当时并没有得到很大推广自iOS7(Xcode5)开始,Autolayout的开发效率得到很大的提升 苹果官方也推荐开发者尽量使用Autolayout来布局UI界面 Autolayout能很轻松地解决屏幕适配的问题 Autola...

weixin_30685029的博客 64

实战指南:如何用Elasticsearch+Milvus搭建十亿级多模态搜索系统(含性能调优)

本文详细介绍了如何利用Elasticsearch和Milvus构建十亿级多模态搜索系统,包括架构设计、性能调优和实战部署。通过混合架构实现高效文本检索与向量相似度计算,显著提升查询性能与扩展能力,适用于大规模多模态数据处理场景。

x8y9z0的博客 1171

史上比较用心的纯代码实现 AutoLayout

概述 使用 Objective-C 纯代码编写 AutoLayout,看 AutoLayout 的字面理解就是自动布局,听起来好像蛮屌的样子。说白了就是适配:适应、兼容各种不同的情况,包括不同版本的操作系统的适配(系统适配)和不同屏幕尺寸的适配(屏幕适配)。 在 Storyboard 中,AutoLayout 有以下 3 个常用面板: [b]Align(对齐)[/b] [img...

{丸の子} 185

Keil5 安装与卸载全攻略:从零开始到完美避坑

本文提供了Keil5集成开发环境的完整安装与卸载指南。针对嵌入式开发新手,详细解析了安装前的关键准备、MDK核心与C51双环境的安装激活步骤、常见问题排查,并重点介绍了如何彻底卸载软件以避免残留问题,帮助用户从零开始搭建稳定高效的开发环境。

weixin_29172963的博客 636

Alibaba Java Coding Guidelines,以后我的Java代码规范,就靠它了

前言 对于Java代码规范,业界有统一的标准,不少公司对此都有一定的要求。但是即便如此,庞大的Java使用者由于经验很水平的限制,未必有规范编码的意识,而且即便经验丰富的老Java 程序员也无法做到时刻将规范牢记于心。所以对于代码规范扫描工具,一经问世就广受青睐,阿里巴巴出品的Alibaba Java Coding Guidelines(阿里巴巴Java代码规约扫描,以下简称为AJCG)插件便是其...

java梦工厂 859

iOS自动布局

一.iOS开发者经历的屏幕适配历程 1.不需要适配(只有一种尺寸,3.5寸),直接使用frame设置大小 . 2.随着ipad的发布,苹果推出了autoresizing来适配横竖屏适配 autoreszing 只能相对父控件设置规则来显示子控件,不能设置兄弟控件的相对关系的,显然不能满足当前的开发需求 3.随着苹果产品线的扩大,屏幕尺寸适配也变得越来越复杂,苹果在iOS

F_T_J 358

把 ST03 的历史数据留得更久:ABAP Workload 统计保留期设置、原理与落地避坑指南

SAP ST03性能数据保留期配置指南 ST03/ST03N是SAP系统性能分析的核心工具,但默认数据保留期通常较短(3个月左右),难以满足跨季度对比、年度规划等需求。本文详细解析了ST03数据保留期的配置方法及注意事项: 数据存储机制:性能数据存储在监控库中,通过定期重组作业清理过期数据 配置路径:7.0+系统在"Workload Collector Database→Reorganization→Control"中按Profile分别设置 关键限制:保留期最大值建议不超过99,否则可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 217
上一篇: 纯代码封装自定义View和XIB封装自定义View的区别
下一篇: UIPickerView
活在生活里
博客等级 码龄11年 94粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值