暑假第一周——网易云音乐仿写

news2025/2/24 0:10:06

iOS学习

  • 前言
  • 发现:控件的堆叠
  • 我的:更换头像
  • 账号:切换夜间
  • 总结

前言

本周正式开始暑期学习,完成了网易云音乐的仿写。


发现:控件的堆叠

请添加图片描述

发现页面由一个无限轮播图,四个自定义cell完成。无限轮播图在之前已经详细解释过。此处给出一个按钮的configuration属性的学习。
当需要文字和图片同时出现在一个按钮中时,我们可以采取settitle再setimage两个方法。但是文字会被初始化为白色,因此要修改文字颜色使文字显现。除此之外,我们还可以使用按钮的configuration来创建一个标题图像按钮。
UIButtonConfiguration是一种装饰模式,仅对装饰响应,不会对手势,消息传递等动作做响应。使用该属性我们需要先定义一个属性并且初始化
UIButtonConfiguration *config = [UIButtonConfiguration plainButtonConfiguration];
下面给出具体使用方法:

for (int i = 0 ; i < 7; i++) {
        UIButtonConfiguration *config = [UIButtonConfiguration plainButtonConfiguration];
        NSString *str = array[i];
        NSString *strImage = [NSString stringWithFormat:@"%@.png",str];
        //为按钮设置标题,还可设置副标题,attritubedSubTitled。
        config.attributedTitle = [[NSAttributedString alloc] initWithString:str];
        config.image = [UIImage imageNamed:strImage];
        //设置图片与文字的格式,此处为文字在下图片在上。
        //leading:文字在右图像在上
        //trailing:文字在左图像在右
        //bottom:文字在上图像在下
        config.imagePlacement = NSDirectionalRectEdgeTop;
        config.buttonSize = UIButtonConfigurationSizeMini;
        //设置图文间隙
        config.imagePadding = 8;
        config.baseForegroundColor = [UIColor blackColor];
  
        config.imageColorTransformer = ^UIColor * _Nonnull(UIColor * _Nonnull color) {
            return [UIColor systemRedColor];};
        
        _btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        _btn.configuration = config;
   
    }

这里仅对该属性做了简单的使用学习,想要更深入的理解还设计了很多没学过的属性。故此处给出学长博客供一起学习:按钮configuration学习博客

下面的则是在自定义cell中滚动轮播图和各种控件的结合,不作赘述。

我的:更换头像

请添加图片描述

该页面主要是通过协议传值更换头像的学习,此外还有分栏控件控制自定义cell中的滚动视图。

在同一个页面控制分栏控件和滚动视图我们学习过,此处大同小异,只需要将自定义cell中的滚动视图调用出来即可。采取定位cell的位置定义一个cell来控制其中的控件。

- (void)segmentedControlValueChanged:(UISegmentedControl *)_segControl {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:3];
    myCell2_4 *cell = [self.tableView0 cellForRowAtIndexPath:indexPath];
    [cell.scrollView0 setContentOffset:CGPointMake(_segControl.selectedSegmentIndex * cell.scrollView0.frame.size.width, 0) animated:YES];
    cell.scrollView0.backgroundColor = [UIColor clearColor];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    if ([scrollView isKindOfClass:[UIScrollView class]]) {
        NSInteger pageIndex = scrollView.contentOffset.x / scrollView.frame.size.width;
        _segControl.selectedSegmentIndex = pageIndex;
    }
}

换头像比较重点的就是使用协议传值,此处我传的是头像名称的字符串,也可以直接穿头像的image。同时要加上一次只能选择一个头像,选多了会判错。只需要设置一个属性变量,每当选择一个时就给count++,判断count是否为一。给出判断代码:

-(void) pressButton:(UIButton *) button{
    button.selected = !button.selected;
    if (button.selected) {
        self.selectPhotoCount++;
        
    } else {
        self.selectPhotoCount--;

    }
}

-(void) press{
    if (self.selectPhotoCount == 1) {
        for (UIView *subview in self.sv.subviews) {
            if ([subview isKindOfClass:[UIButton class]]) {
                UIButton *button = (UIButton *) subview;
                if (button.selected) {
                    _strImageSend = [NSString stringWithFormat:@"头像%ld.jpg",(long)(button.tag - 100)];
                    if ([self.delegate respondsToSelector:@selector(didSelectImageWithNameAgain:)]) {
                           [self.delegate didSelectImageWithNameAgain:_strImageSend];
                       }
                    button.selected = NO;
                    [self.navigationController popToRootViewControllerAnimated:YES];

                    break;
                }
            }
        }
    } else {
        _alertVier = [UIAlertController alertControllerWithTitle:@"警告" message:@"只能选择一张图片" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction* action01 = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){/* 在这里编写执行该选项的代码*/}];
        [_alertVier addAction:action01];
        [self presentViewController:_alertVier animated:YES completion:nil];
    }
}

关于传值问题,待深入学习理解后,单独写一篇博客总结。

账号:切换夜间

先给出效果图:

请添加图片描述
夜间模式主要是通过传值,在Switch不同状态时传出不同的值,然后对背景颜色进行更改,此处给出一种思路:
在switch控件中:

- (void) swChange:(UISwitch*) sw
{
    _dictionary = [NSMutableDictionary dictionary];
    _isNightMode1 = sw.isOn;
    if (_isNightMode1) {
        [_dictionary setValue:@"night" forKey:@"key"];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"notice" object:nil userInfo:_dictionary];
        _label2.textColor = [UIColor whiteColor];
    } else {
        [_dictionary setValue:@"white" forKey:@"key"];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"notice" object:nil userInfo:_dictionary];
        _label2.textColor = [UIColor blackColor];
    }
}

在视图控制器中:

-(void) receiveNotice:(NSNotification *)send {
    self.strflag = send.userInfo[@"key"];
    if ([self.strflag  isEqual: @"night"]) {
                    self.tableView.backgroundColor = [UIColor darkGrayColor];
                    self.tabBarController.tabBar.backgroundColor = [UIColor systemBlueColor];
                    self.tabBarController.tabBar.barTintColor = [UIColor systemBlueColor];
                    self.tabBarController.tabBar.tintColor = [UIColor systemBlueColor];
    } else {
                    self.tableView.backgroundColor = [UIColor whiteColor];
                    self.tabBarController.tabBar.backgroundColor = [UIColor systemBlueColor];
                    self.tabBarController.tabBar.barTintColor = [UIColor systemBlueColor];
                    self.tabBarController.tabBar.tintColor = [UIColor systemBlueColor];
    }
    [_tableView reloadData];
}

要将变量传递到其他视图中,则需要使用的通知传值。后续在博客中总结吧。


总结

网易云音乐的仿写收获颇丰。无论是对传值的学习还是对控件的使用,明显的感受到了自己的进步。继续努力!

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

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

相关文章

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十九章 等待队列

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

css 作业 2

文章目录 前言第四题第五题第六题第七题第八题第九题第十题&#xff08;子标签&#xff09; 前言 昨天写了前面三次作业&#xff0c;今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html&#xff0c;就用这个网址查看代码在网页的展示效果 代码评测过不了&…

【C语言】文件操作,文件读写详细介绍

目录 为什么要使用文件&#xff1f; 文件概念 1. 什么是文件&#xff1f; 2. 程序文件 3. 数据文件 4. 文件名 文件的使用 1. 文件指针 2. 文件的打开与关闭 文件的顺序读写 1. 顺序读写函数 2. scanf系列与printf系列 文件的随机读写 1. fseek 2. ftell 3. …

【C++】实验三

题目&#xff1a; 1、如何使用C来找出编码88表示的字符&#xff1f;指出至少两种方法。 思路&#xff1a;方法一定义一个字符型变量直接等于88&#xff0c;将其输出结果为编码88表示的字符&#xff1b;方法二使用整形变量来存储88&#xff0c;输出时将其强制转换成字符型。 …

GD32 MCU如何将烧录口配置为GPIO使用?

如果大家在进行GD32 MCU开发时发现GPIO引脚使用不足&#xff0c;可以尝试将烧录口配置为GPIO使用&#xff0c;这样就可以多出几个引脚使用&#xff0c;但使用的时候如何配置以及有哪些注意事项&#xff0c;本视频将会为大家进行解答。 GD32 MCU存在两种GPIO备用功能的配置&…

数字陷波器的设计和仿真(Matlab+C)

目录 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 2. 示例2 三、C语言仿真 1. 由系统函数计算差分方程 2. 示例代码 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 clear clc f0=100;%滤掉的100Hz fs=1000;%大于两倍的信号最高频率 r=0.9; w0=2*pi*f0/fs;%转换到…

【深度学习】语音合成,TTS,fish-speech

官方项目地址&#xff1a;https://github.com/fishaudio/fish-speech git clone https://github.com/fishaudio/fish-speech.gitdocker run -it --gpus device3 -v /ssd/xiedong/tts:/ssd/xiedong/tts --net host --shm-size 16G kevinchina/deeplearning:pytorch2.3.0-cuda12.…

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

玩转CSS&#xff1a;用ul li JS 模拟select&#xff0c;避坑浏览器不兼容。 在前端的工作中&#xff0c;经常会遇到 selcet控件&#xff0c;但我们用css来写它的样式时候&#xff0c;总是不那么令人满意&#xff0c;各种浏览器不兼容啊有没有&#xff1f; 那么&#xff0c;我…

Datawhale AI 夏令营——AI+逻辑推理——Task1

# Datawhale AI 夏令营 夏令营手册&#xff1a;从零入门 AI 逻辑推理 比赛&#xff1a;第二届世界科学智能大赛逻辑推理赛道&#xff1a;复杂推理能力评估 代码运行平台&#xff1a;魔搭社区 比赛任务 本次比赛提供基于自然语言的逻辑推理问题&#xff0c;涉及多样的场景&…

27K star!有没有显卡都能搞,快速基于LLM构建本地智能知识库

觉得搞一个AI的智能问答知识库很难吗&#xff1f;那是你没有找对方向和工具&#xff0c; 今天我们分享一个开源项目&#xff0c;帮助你快速构建基于Langchain 和LLM 的本地知识库问答&#xff0c;在GitHub已经获得27K star&#xff0c;它就是&#xff1a;Langchain-Chatchat L…

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代&#xff0c;信息安全的重要性不言而喻&#xff0c;尤其当涉及到个人隐私和账户安全时。每天&#xff0c;无数的用户登录各种在线服务&#xff0c;从社交媒体到银行账户&#xff0c;再到电子邮件和云存储服务。这些服务的背后&#xff0c;是复杂的系统架构&am…

进程间关系

目录 亲缘关系 进程组关系 会话关系 孤儿态进程 亲缘关系 亲缘关系主要体现于父子进程&#xff0c;子进程父进程创建&#xff0c;代码继承于父进程&#xff0c;父进程负责回收&#xff0c;子进程诞生至结束父进程全程参与&#xff0c;这种称为强亲缘关系。 系统开机后&…

企业级数据分析平台合集介绍

企业发展离不开数据分析&#xff0c;数据分析推动着企业运营、决策和战略规划。它正逐步深入到各行各业的核心业务流程中&#xff0c;从传统的金融、零售、制造业扩展到医疗健康、教育、能源等更多领域。企业正通过数据分析平台实现数据资源的最大化利用&#xff0c;推动业务与…

wireshark--流量分析利器

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

基于微信小程序的课堂考勤系统的设计与实现(论文+源码)_kaic

基于微信小程序的课堂考勤系统的设计与实现 摘 要 在高校教育普及的今天&#xff0c;学生人数日益增多&#xff0c;为保证课堂质量&#xff0c;教师多要在课前进行考勤。因此本设计提出基于微信小程序的课堂考勤系统&#xff0c;增加了定位功能&#xff0c;避免了“假打卡”…

探索大型语言模型LLama 2:原理揭秘与代码实践

一、引言 1.1 大型语言模型的重要性 大型语言模型作为人工智能领域的重要研究方向&#xff0c;近年来取得了显著的成果。这些模型在自然语言处理、机器翻译、对话系统、文本生成等领域展现了强大的能力&#xff0c;为人类带来了诸多便利。大型语言模型的出现&#xff0c;使得…

卓码软件测评:软件功能测试和非功能测试详情介绍

随着信息技术的不断发展&#xff0c;软件在我们日常生活与工作中扮演着越来越重要的角色。然而&#xff0c;软件质量的好坏直接关系到使用者的体验和企业的声誉。在软件开发过程中&#xff0c;功能测试和非功能测试作为保证软件质量的重要手段&#xff0c;受到了越来越多的关注…

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下&#xff0c;只有出现RunTimeException才会回滚事务&#xff0c;rollbackfor属性用于控制出现何种异常类型&#xff0c;回滚…

Flink内存管理机制

前言 在Flink的后台界面&#xff0c;可以看到整个Flink的内存情况。 如JobManager的内存情况&#xff1a; TaskManager的内存情况 一、Flink内存管理 Flink TaskManager内存组成整体结构图如下&#xff1a; 二、总内存管理 三、JobManager内存管理内存管理 四、TaskManager内…

运算符优先级、赋值运算符、一元运算符、逻辑运算符

运算符优先级 字符串 布尔 null undefined 赋值运算符 一元运算符 逻辑运算符 && 逻辑与 ||逻辑或 &#xff1f;&#xff1f;空值合并运算符 称为空值合并运算符&#xff0c;它是ES6的一个新特性&#xff0c;它的作用是当一个表达式是nul或者undefined时为变量设…