【iOS】暑假第二周——网易云APP 仿写

news2024/11/26 10:17:29

目录

  • 前言
  • 首页
    • 关于UINavigationBarAppearance
  • “我的”
  • 账号
  • 夜间模式——多界面传值
  • 遇到的问题
  • 所用到的其他知识整理
    • NSNotification
    • reloadData
    • 各种键盘模式
  • 总结

前言

  有了之前仿写ZARA的基础,本周我们仿写了网易云APP,在这里对多界面传值进行了首次应用——夜间模式和换头像功能。以下是我在仿写网易云时觉得比较重要的地方和遇到的问题。

首页

  主要包含导航栏,搜索框,无限自动轮播图,以及三个UILabel和与之对应的TableView。其中比较重要的是,当用户滑动页面时,页面上的内容跟着画布一起动,而顶部的导航栏则不动,且用户放手后,页面回到原位置。

效果图如下:
在这里插入图片描述
其中无限轮播图及自动播放跟zara的仿写的实现方法相同。而下面的红标功能和推荐歌单,最近常听等就是自定义cell和滚动视图的结合。
我这里以推荐歌单部分的滚动视图为例,给出代码:

//homeTableViewCell.m
    if ([self.reuseIdentifier isEqualToString:@"tuijiangedan"]) {
        _tuijiangedanLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, WIDTH, 20)];
        _tuijiangedanLabel.text = @"  推荐歌单 >";
        _tuijiangedanLabel.textColor = [UIColor blackColor];
        _tuijiangedanLabel.font = [UIFont systemFontOfSize:17];
        _tuijiangedanLabel.backgroundColor = [UIColor whiteColor];
        if (swDelegate.isNighted) {
            _tuijiangedanLabel.backgroundColor = [UIColor grayColor];
            _tuijiangedanLabel.textColor = [UIColor blackColor];
        } else {
            _tuijiangedanLabel.backgroundColor = [UIColor whiteColor];
            _tuijiangedanLabel.textColor = [UIColor blackColor];
        }
        [self.contentView addSubview:_tuijiangedanLabel];
        
        _tuijiangedanScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 50, WIDTH, 110)];
        _tuijiangedanScrollView.contentSize = CGSizeMake(WIDTH * 2, 130);
        _tuijiangedanScrollView.bounces = YES;
        _tuijiangedanScrollView.alwaysBounceHorizontal = YES;
        _tuijiangedanScrollView.alwaysBounceVertical = NO;
        _tuijiangedanScrollView.showsHorizontalScrollIndicator = YES;
        _tuijiangedanScrollView.scrollEnabled = YES;
        _tuijiangedanScrollView.pagingEnabled = YES;
        
        _tuijiangedanArray = @[@"tuijiangedan1.jpg", @"tuijiangedan2.jpg", @"tuijiangedan3.jpg", @"tuijiangedan4.jpg", @"tuijiangedan5.jpg", @"tuijiangedan6.jpg"];
        _tuijiangedantitleArray = @[@"【华语经典】那些年听不厌的经典😋", @"✨温柔女声·开口惊艳的女声翻唱", @"心动旋律|挖掘星辰大海中的宝藏💎", @"💌短发 故事 与她", @"连空想都红了眼是有多遗憾😔", @"华语宝藏R&B|来自过去的浪漫氛围🌄"];
//        if (swDelegate.isNighted) {
//            _tuijiangedanScrollView.backgroundColor = [UIColor blackColor];
//        } else {
//            _tuijiangedanScrollView.backgroundColor = [UIColor whiteColor];
//        }
        for (int i = 0; i < 6; i++) {
            NSString* str = [[NSString alloc] initWithString:_tuijiangedanArray[i]];
            UIImage* image = [[UIImage alloc] init];
            image = [UIImage imageNamed:str];
            UIImageView* iView = [[UIImageView alloc] initWithImage:image];
            iView.frame = CGRectMake(10 + 130 * i, 0, 110, 110);
            iView.layer.cornerRadius = 7;
            iView.layer.masksToBounds = YES;
            [_tuijiangedanScrollView addSubview:iView];
            
            self.tuijiangedanLabel2 = [[UILabel alloc] initWithFrame: CGRectMake(10 + 130 * i, 110, 120, 50)];
            self.tuijiangedanLabel2.font = [UIFont systemFontOfSize: 14];
            self.tuijiangedanLabel2.text = _tuijiangedantitleArray[i];
            self.tuijiangedanLabel2.textColor = [UIColor blackColor];
            self.tuijiangedanLabel2.numberOfLines = 2;
//            if (swDelegate.isNighted) {
//                _tuijiangedanLabel2.backgroundColor = [UIColor blackColor];
//                _tuijiangedanLabel2.textColor = [UIColor whiteColor];
//            } else {
//                _tuijiangedanLabel2.backgroundColor = [UIColor whiteColor];
//                _tuijiangedanLabel2.textColor = [UIColor blackColor];
//            }
            [self.tuijiangedanScrollView addSubview: self.tuijiangedanLabel2];
        }
        [self.contentView addSubview:_tuijiangedanScrollView];
    } 

在这里学到比较多的是关于导航栏的设置和滑动屏幕时,上面除了导航栏外的内容跟着画布一起动。

下面是导航栏设置的相关代码:

    UINavigationBarAppearance* appearance = [[UINavigationBarAppearance alloc] init];
    appearance.backgroundColor = [UIColor whiteColor];
    //取消图像阴影
    appearance.shadowImage = [[UIImage alloc] init];
    appearance.shadowColor = nil;
    
    _leftbtn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"caidan.png"] style:UIBarButtonItemStylePlain target:self action:nil];
    _leftbtn.tintColor = [UIColor redColor];
    _leftbtn.width = 30;
    self.navigationItem.leftBarButtonItem = _leftbtn;
    //[self.tableView reloadData];
    
    _search = [[UISearchBar alloc] init];
    _search.frame = CGRectMake(30, 0, 250, 30);
    self.textField = [[UITextField alloc] initWithFrame:CGRectMake(30, 0, 250, 30)];
    _search.searchBarStyle = UISearchBarStyleMinimal;
    _search.placeholder = @"凤凰传奇";
    _search.keyboardType = UIKeyboardTypeDefault;
    self.navigationItem.titleView = _search;
    
    _rightbtn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"tinggeshiqu.png"] style:UIBarButtonItemStylePlain target:self action:nil];
    _rightbtn.tintColor = [UIColor redColor];
    _rightbtn.width = 30;
    self.navigationItem.rightBarButtonItem = _rightbtn;
    
    self.navigationController.navigationBar.standardAppearance = appearance;
    self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
    [self.tableView reloadData];

关于UINavigationBarAppearance

  UINavigationBarAppearance 的 shadowImage 和 shadowColor 属性用来控制导航栏的阴影效果。默认情况下,导航栏有阴影效果以提升视觉层次感,但你可以根据需要进行自定义。下面是对阴影效果的详细说明解释。

导航栏阴影效果:

  1. 阴影图像 (shadowImage)
  • 默认阴影图像:UINavigationBar 的默认样式通常包括一个阴影图像,这个图像创建了一个底部边缘的阴影效果,使导航栏从下方看起来有一个轻微的阴影。
  • 自定义阴影图像:你可以设置 shadowImage 属性为一个自定义的 UIImage 对象,以改变或移除阴影效果。如果将 shadowImage 设置为一个自定义的图像,它会替换掉默认的阴影效果。
  1. 阴影颜色 (shadowColor)
  • 默认阴影颜色:导航栏的阴影颜色是系统默认的颜色。
  • 自定义阴影颜色:你可以通过 shadowColor 属性设置一个自定义的阴影颜色,或者将其设置为 nil 以移除阴影颜色,使导航栏没有阴影效果。

如何管理和自定义阴影效果:

  1. 移除阴影
    如果你想移除导航栏的阴影效果,可以将 shadowImage 设置为 nil,或者设置一个透明的图像。示例如下:
UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
appearance.backgroundColor = [UIColor systemBackgroundColor]; // 设置背景颜色
appearance.shadowImage = nil;  // 移除阴影图像
appearance.shadowColor = nil; // 移除阴影颜色(可选)

if (self.navigationController) {
    self.navigationController.navigationBar.standardAppearance = appearance;
    self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
}
  1. 设置自定义阴影图像
    如果你需要自定义阴影效果,可以创建一个带有阴影的 UIImage,然后设置 shadowImage 属性:
UIImage *customShadowImage = [UIImage imageNamed:@"customShadowImage"]; // 使用自定义的阴影图像
appearance.shadowImage = customShadowImage;

if (self.navigationController) {
    self.navigationController.navigationBar.standardAppearance = appearance;
    self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
}
  1. 调整阴影颜色
    虽然 shadowColor 属性在 UINavigationBarAppearance 中不直接存在,shadowImage 和 backgroundImage 属性间接控制了阴影的显示。在某些情况下,你可能需要通过自定义图像来设置阴影的颜色效果。
    如果需要更新导航栏的外观,移除阴影并应用新的背景颜色,代码示例如下:
- (void)updateNavigationBarAppearanceWithColor:(UIColor *)newColor {
    UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
    appearance.backgroundColor = newColor;
    appearance.shadowImage = nil;  // 移除默认的阴影图像
    appearance.shadowColor = nil;  // 适配阴影颜色的移除

    if (self.navigationController) {
        self.navigationController.navigationBar.standardAppearance = appearance;
        self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
    }
}

解释

  • shadowImage 控制阴影图像的显示。如果设置为 nil,阴影将被移除。
  • shadowColor 用于设置阴影颜色,但在现代 iOS 开发中,通常通过图像来控制阴影效果。
  • 默认行为:如果未设置 shadowImage,系统将使用默认的阴影效果。
    通过这些方法,你可以自定义导航栏的视觉效果,确保它符合你的应用设计需求。

“我的”

  这个界面主要就是滚动视图和分栏控件及滚动视图的结合(这个跟zara仿写里的是一样的),还有就是云盘空间的界面的推出。
下面先给出效果图:
在这里插入图片描述
滚动视图跟home界面同理,与分栏控件的结合与zara里面同理。下面给出云盘界面跳转的代码(其实就是为按钮添加事件函数,然后在事件函数里实现页面的推出):

//云盘空间按钮的设置
    UIImage* icon = [[UIImage alloc] init];
    icon = [UIImage imageNamed:@"cloudbtn.png"];
    CGSize newSize = CGSizeMake(35,35);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [icon drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage* resizedImage = [[UIImage alloc] init];
    resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:resizedImage style:UIBarButtonItemStylePlain target:self action:@selector(yunpankongjian)];
    leftButton.tintColor = UIColor.redColor;

//按下按钮的函数实现
- (void) yunpankongjian {
    cloudRoomViewController* yun = [[cloudRoomViewController alloc] init];
    yun.hidesBottomBarWhenPushed = YES;
    UIBarButtonItem* bar = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationItem.backBarButtonItem = bar;
    [self.navigationController pushViewController:yun animated:YES];
}

账号

账号页面没什么复杂的东西,就是一个tableView,最关键的是夜间模式的按钮,要将按钮状态传到其他页面,为夜间模式作铺垫。
效果图如下:
在这里插入图片描述

夜间模式——多界面传值

这里先给出效果图:
在这里插入图片描述
我们这里主要使用的的属性传值,在appDelegate.m里设置一个属性,可以被整个程序访问,通过按钮的开关状态来改变view,label和text的相关颜色。然后在每个自定义cell里设置开关打开后,控件的颜色状态即可(类似于下面的代码)。关于属性传值,可以去看我的上一篇博客。

if (swDelegate.isNighted) {
            [_starListbutton setTintColor: UIColor.grayColor];
            [_myListbutton setTintColor: UIColor.grayColor];
            [_starListbutton setTitleColor:UIColor.lightGrayColor forState:UIControlStateNormal];
            [_myListbutton setTitleColor:UIColor.lightGrayColor forState:UIControlStateNormal];
            [_starListbutton setTitleColor:UIColor.whiteColor forState:UIControlStateSelected];
            [_myListbutton setTitleColor:UIColor.whiteColor forState:UIControlStateSelected];
        } else {
            [_starListbutton setTintColor: UIColor.whiteColor];
            [_myListbutton setTintColor: UIColor.whiteColor];
            [_starListbutton setTitleColor:UIColor.grayColor forState:UIControlStateNormal];
            [_myListbutton setTitleColor:UIColor.grayColor forState:UIControlStateNormal];
            [_starListbutton setTitleColor:UIColor.blackColor forState:UIControlStateSelected];
            [_myListbutton setTitleColor:UIColor.blackColor forState:UIControlStateSelected];
        }

遇到的问题

对于各种view的层级关系还不是特别清晰明了,有时候会出现,view在视图上被遮盖,显示不出来的情况。自定义cell时,有时对cell的尺寸拿捏不好,需要来回改动,比较浪费时间。
在用导航栏创建图像时,如果需要透明,要注意移除图像阴影。
mycell里点击单元格松手后,单元格依旧是灰色的,没有恢复到点击前的状态,需要使用deselectRowAtIndexPath: 方法。
对于五种多界面传值理解的还不是很透彻。

所用到的其他知识整理

NSNotification

NSNotification是 iOS 和 macOS 中用于传递信息的类,它是 NSNotificationCenter 的重要组成部分。通知(NSNotification)用于在应用程序的不同部分之间传递信息,而不需要这些部分直接相互引用。这种机制非常适合于解耦合的通信方式,尤其是在复杂的应用中。

主要特点:

  1. 封装通知信息:
    NSNotification 类封装了有关通知的所有信息,包括通知的名称、发送通知的对象以及任何附加的数据(userInfo 字典)。
  2. 通知的创建和发送:
    通知通常由某个对象创建并发送,其他对象可以注册为观察者,以便在通知发送时执行特定的操作。

主要属性和方法:

  1. name 属性:
    通知的名称,是一个 NSString 类型的属性。它用于标识通知的类型。
  2. object 属性:
    发送通知的对象。这可以是任何对象,通常是发送通知的对象本身。接收通知的观察者可以选择只对特定对象发送的通知做出响应,或者不关心对象(即 nil)。
  3. userInfo 属性:
    一个字典(NSDictionary),用于传递附加信息。这个字典可以包含任何类型的键值对,用于通知的详细数据。
  4. 初始化方法:
- (instancetype)initWithName:(NSString *)name object:(nullable id)object userInfo:(nullable NSDictionary *)userInfo;

    * name:通知的名称。
    * object:发送通知的对象(可以是 nil)。
    * userInfo:附加信息字典(可以是 nil)。

reloadData

在 iOS 开发中,reloadData 是一个常用的方法,主要用于刷新视图控件中的数据内容。这个方法通常用于表视图(UITableView)或集合视图(UICollectionView),它会重新加载视图控件中的所有数据项,并刷新界面的显示。

  1. UITableView 中的 reloadData:

用途:在 UITableView 中,reloadData 会重新加载表视图中的所有数据,刷新所有的单元格(UITableViewCell)。这在数据源发生变化后非常有用,例如数据从网络加载完成后,或者数据被修改时。

调用方式:

[self.tableView reloadData];

注意事项:
在调用 reloadData 时,表视图会重新调用数据源方法来更新所有单元格,因此要确保数据源的数据是最新的。
* reloadData 会使整个表视图重新加载,这可能会导致性能开销,特别是在表视图包含大量数据时。

  1. UICollectionView 中的 reloadData
    用途:在 UICollectionView 中,reloadData 会重新加载集合视图中的所有项(UICollectionViewCell)。适用于集合视图的数据源发生变化时,刷新整个集合视图的显示。
    调用方式:
[self.collectionView reloadData];

注意事项:
与 UITableView 类似,reloadData 会导致集合视图重新调用数据源方法,并重新布局所有单元格。这可能会影响性能,尤其是当集合视图中包含大量数据项时。

各种键盘模式

UIKeyboardTypeDefault: 默认键盘类型,适用于一般文本输入。
UIKeyboardTypeASCIICapable:ASCII字符键盘,适用于只需要ASCII字符的输入。
UIKeyboardTypeNumbersAndPunctuation:数字和标点符号键盘,适用于需要输入数字和标点符号的场景。
UIKeyboardTypeURL:专门用于输入URL的键盘,通常包括用于输入斜杠的特殊键。
UIKeyboardTypeNumberPad:仅包含数字的键盘,适用于仅需要输入数字的场景,如电话号码或计算器输入。
UIKeyboardTypePhonePad:专为电话号码输入设计的键盘,包含常用的电话号码符号。
UIKeyboardTypeEmailAddress:适用于电子邮件地址输入的键盘,包含电子邮件地址输入所需的特殊字符。
UIKeyboardTypeDecimalPad:数字键盘,包含一个小数点,用于输入需要小数点的数字。
UIKeyboardTypeWebSearch:用于 Web 搜索的键盘,包含搜索相关的字符和布局。

总结

  刚开始写网易云可能会比较慢,对于知识的运用和视图控件位置的把控不太好,在这个仿写中不但复习了之前学的知识,而且也学到了reloadData等新知识,也粗略学习了多界面传值的知识,为后面3G share的仿写作铺垫。

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

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

相关文章

LISA: Reasoning Segmentation via Large Language Model

发表时间&#xff1a;CVPR 2024 论文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2024/papers/Lai_LISA_Reasoning_Segmentation_via_Large_Language_Model_CVPR_2024_paper.pdf 作者单位&#xff1a;CUHK Motivation&#xff1a;尽管感知系统近年来取得了显…

基于SSH的医院在线挂号系统设计与实现

点击下载源码 基于SSH的医院在线挂号系统设计与实现 摘 要 互联网技术迅速的发展给我们的生活带来很大的方便&#xff0c;同时也让许多行业迅速的发展起来。互联网技术已走向科技发展的巅峰期&#xff0c;我们要做的就是合理的使用互联网技术让我们的各个行业得到更快速的发展…

2024杭电多校06——1005交通管控

补题点这里 大意 一个操作杆可以对k个红绿灯进行操作&#xff0c;操作杆上的一个字符对应一个红绿灯&#xff0c;操作包括,-,0,问每种组合方案有多少种组合方式 : red->green->yellow->red -:green->red->yellow->green 可以用一个三进制数表示每个灯的状态…

Python(模块---pandas+matplotlib+pyecharts)

import pandas as pd import matplotlib.pyplot as plt dfpd.read_excel(简易数据.xlsx) # print(df) plt.rcParams[font.sans-serif][SimHei] #设置画布的大小 plt.figure(figsize(10,6)) labelsdf[电影中文名] ydf[国籍] # print(labels) # print(y)# import pandas as pd im…

[Webpack]webpack-dev-server设置多个路径代理时,proxy顺序有要求

问题背景 前端需要调用多个不同的后台时需要使用devServer.proxy做代理 问题现象 如下图设置ETL相关接口路径代理之后 调用ETL后台接口时产生404报错 问题原因 devServer.proxy在解析代理路径并替换的时候是按顺序解析的&#xff0c;我配置的三个代理中&#xff0c;/csm…

NCL数据分析与处理实践技术

NCAR Command Language&#xff08;NCL&#xff09;是由美国大气研究中心&#xff08;NCAR&#xff09;推出的一款用于科学数据计算和可视化的免费软件。它有着非常强大的文件输入和输出功能&#xff0c;可读写netCDF-3、netCDF-4 classic、HDF4、binary、ASCII数据&#xff0c…

Linux之软硬链接和动静态库

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 C进阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.软硬链接 1.1如何软硬链接 1.2软硬链接的作用 …

ViP-LLaVA: Making Large Multimodal Models Understand Arbitrary Visual Prompts

发表时间&#xff1a;cvpr2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2357936887983293952&noteId2426262228488986112 作者单位&#xff1a;University of Wisconsin–Madison Motivation&#xff1a;现在的多模态模型都关注整张图像的理…

html+css网页设计 qq官网首页1个页面无js

htmlcss网页设计 qq官网首页1个页面无js功能 页面1:1还原 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 …

冲击性信号的频域特征

这是一个信号采样数学实验&#xff0c;你可以直观感受到冲击信号的时域和频域特征 1.原始冲击信号&#xff1a; 原始信号是一个频率为180Hz附近的一个冲击性信号&#xff1a; 2.冲击信号频谱 它的频谱&#xff0c;可能会超出你的想象&#xff0c;它的1x频率幅度可能并不最高…

iOS ------ autoreleasePool

一&#xff0c;autoReleasePool{} int main(int argc, const char * argv[]) {autoreleasepool {}return 0; }我们平时创建一个main函数的代码的时候&#xff0c;就会发现其中有一个这个东西autoreleasepool{}&#xff0c;使用clang编译之后&#xff1a;autoreleasepool{…}被…

对《国家汽车芯片标准体系建设指南》好奇,遂读

基础通用&#xff1a;基于汽车行业对芯片的可靠性、运行稳定性 和安全性等应用需求&#xff0c;提取出汽车芯片性通用要求&#xff0c;主要包括环境及可靠性、电磁兼容、功能安全和信息安全共4个方面的要求。 产品与技术应用&#xff1a;根据实现功能的不同&#xff0c;将汽车…

文献综述能否帮助研究人员认识特定学术领域的趋势和新兴主题

VersaBot一键生成文献综述 进行良好的文献综述可以成为研究人员识别特定学术领域的趋势和新兴主题的强大工具。就是这样; 1. 识别模式和重复出现的概念&#xff1a; 当您深入研究现有研究时&#xff0c;您自然会开始注意到不同研究中采用的重复出现的主题、想法和方法。这些模…

详解爬虫使用代理ip的几种方案

​ 在如今这个信息爆炸的时代&#xff0c;数据就是财富。对于许多从事数据分析、市场调研和大数据处理的人来说&#xff0c;网络爬虫已经成为了他们的得力助手。然而&#xff0c;随着网站对爬虫的防范措施越来越严格&#xff0c;使用代理IP已经成为了爬虫工作中的一项必备技能。…

05:【stm32】重映射AFIO

重映射AFIO 1、什么是AFIO2、怎么使用AFIO 1、什么是AFIO AFIO是stm32上的众多片上外设之一&#xff0c;专门用来执行“复用功能的重映射” 2、怎么使用AFIO 如下图所示&#xff1a;当我们要同时使用USART1和TIM1时&#xff0c;我们就需要使用AFIO进行使其中一个片上外设进行重…

【iOS】SideTable

目录 SideTablesStripedMapSideTable1. spinlock_t slock2. RefcountMap3. weak_table_t 总结 objc4源码地址&#xff1a; SideTable& table SideTables()[this]; // 获取对象的SideTable size_t& refcntStorage table.refcnts[this];SideTables 查源码SideTables…

Android 多语言切换

文章目录 在系统设置修改语言创建资源目录创建资源文件示例验证 代码手动切换语言在Application中设置新的语言环境在MainActivity / BaseActivity中设置新的语言环境验证 问题1. makeText()方法context传入是Application的context&#xff0c;无法获取正确的资源字符串原因解决…

Docker + Nacos + Spring Cloud Gateway 实现简单的动态路由配置修改和动态路由发现

1.环境准备 1.1 拉取Nacos Docker镜像 从Docker Hub拉取Nacos镜像&#xff1a; docker pull nacos/nacos-server:v2.4.01.2 生成密钥 你可以使用命令行工具生成一个不少于32位的密钥。以下是使用 OpenSSL 生成 32 字节密钥的示例&#xff1a; openssl rand -base64 321.3 …

免费插件集-illustrator插件-Ai插件-选择路径等分

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;路径处理功能&#xff0c;功能是选择路径等分。首先从下载网址下载这款插件 https://download.csdn.net/download…

本地Gitlab-runner自动编译BES项目

0 Preface/Foreword 1 Gitlab-runner配置情况 具体情况如下&#xff1a; Gitlab-ruuner运行在wsl 1中的Ubuntu 18.04 distro上专门为GitLab-runner分配了一个用户&#xff0c;名为gitlab-runner 2 自动编译 2.1 找不到编译工具链 根据错误提示&#xff0c;交叉编译工具链未找…