IOS开发基础知识--碎片25

1:使用@protocol实现delegate和datasource模式

复制代码
#import <UIKit/UIKit.h>


@protocol MyViewDataSource,MyViewDelegate;

@interface myView : UIView<UIAlertViewDelegate>

@property(nonatomic,assign)id<MyViewDelegate> myViewDelegate;

@property(nonatomic,assign)id<MyViewDataSource> myViewDataSource;

-(void)myShowAlert;

@end



@protocol MyViewDelegate <NSObject>

@optional

-(void)alertDidPop:(myView *)myView;

-(void)alertConfirmShow:(myView *)myView clickedButtonAtIndex:(NSInteger)buttonIndex;

@end


@protocol MyViewDataSource <NSObject>

@optional

-(NSString *)textOfAlert:(myView *)myView;

@required

- (NSUInteger)numberOfItemsInMyView:(myView *)myView;

@required

@end
复制代码
复制代码
#import "myView.h"

@implementation myView

-(void)myShowAlert
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"测试实例"
                                                    message:@"message"
                                                   delegate:self
                                          cancelButtonTitle:@"取消"
                                          otherButtonTitles:@"确定",nil];
    alert.message = [self.myViewDataSource textOfAlert:self];
    [alert show];
}

- (void)didPresentAlertView:(UIAlertView *)alertView
{
    [self.myViewDelegate alertDidPop:self];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [self.myViewDelegate alertConfirmShow:self clickedButtonAtIndex:buttonIndex];
}

@end
复制代码

使用方式:

#import "myView.h"

@interface ViewController ()<MyViewDataSource,MyViewDelegate>

@end
复制代码
- (void)viewDidLoad {
    [super viewDidLoad];
    
    myView *myVw = [[myView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
    myVw.myViewDataSource = self;
    myVw.myViewDelegate = self;
    [self.view addSubview:myVw];
    [myVw myShowAlert];
}
复制代码
复制代码
代理实现的方法:

- (void)alertDidPop:(UIView *)myView
{
    myView.backgroundColor = [UIColor yellowColor];
}

-(NSString *)textOfAlert:(myView *)myView
{
    return @"信息";
}

-(void)alertConfirmShow:(myView *)myView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSLog(@"你选中了%d",buttonIndex);
}
复制代码

 2:动画 UIView animateWithDuration 使用详解

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

duration为动画持续的时间。animations为动画效果的代码块

可设动作属性:

  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch

例如一个视图淡出屏幕,另外一个视图出现的代码

[UIView animateWithDuration:1.0 animations:^{
        firstView.alpha = 0.0;
        secondView.alpha = 1.0;
}];

连续动画(可以在completion代码块中添加动画):

复制代码
[UIView animateWithDuration:2.0
                 animations:^{
                     oldImageView.alpha = 0.0;
                     newImageView.alpha = 1.0;
                     //imageView.center = CGPointMake(500.0, 512.0);
                 }
                 completion:^(BOOL finished){
                     [UIView animateWithDuration:4.0
                                      animations:^{
                                          newImageView.center = CGPointMake(500.0, 512.0);
                                      }];
                 }];
复制代码

从上往下一个动作(默认是左上角,把要改变的值放在animations里):

复制代码
-(UIView *)myView
{
    if (!_myView) {
        _myView=[[UIView alloc]initWithFrame:CGRectZero];
        _myView.backgroundColor=[UIColor redColor];
    }
    return _myView;
}


- (IBAction)BtnAction:(id)sender {
    self.myView.frame = CGRectMake(0,44, 320, 0);
    [self.view addSubview:self.myView];
    [UIView animateWithDuration:0.3 animations:^{
        self.myView.backgroundColor=[UIColor redColor];
        self.myView.frame = CGRectMake(0,44, 320, 100);
    
    } completion:^(BOOL finished) {

    }];
}
复制代码

 3:UIView 的旋转和缩放

复制代码
 label.transform = CGAffineTransformMakeRotation(90 *M_PI / 180.0);

//顺时针旋转 90度

 label.transform = CGAffineTransformMakeRotation(180 *M_PI / 180.0);

//顺时针 旋转180度

 label.transform = CGAffineTransformMakeRotation(270 *M_PI / 180.0);

//顺时针旋转270度

CGAffineTransform transform = label.transform;

transform = CGAffineTransformScale(transform, 2,0.5);//前面的2表示横向放大2倍,后边的0.5表示纵向缩小一半  

label.transform = transform;
复制代码

 4:加载歌词的代码实例

复制代码
[ti:伤痕]
[ar:曾敏杰]
[al:]
[by:]
[offset:0]
[00:00.11]伤痕 (Live) - 曾敏杰
[00:01.58]词:李宗盛
[00:02.41]曲:李宗盛
[00:03.28]键盘:刘卓/李海郡
[00:04.78]吉他:高飞/金天
[00:06.20]贝司:李九君
[00:07.29]鼓手:卢炜
[00:08.17]乐队总监:刘卓
[00:09.43]音响总监:金少刚
[00:11.01]
[00:22.75]夜已深 还有什么人
[00:28.21]让你这样醒着数伤痕
[00:32.28]
[00:33.09]为何临睡前会想要留一盏灯
[00:38.04]你若不肯说 我就不问
[00:42.07]
[00:42.74]只是你现在不得不承认
[00:47.35]
[00:47.93]爱情有时候是一种沉沦
复制代码

歌词都是以lrc的文件内容,可以进行加载,然后对它进行处理;

复制代码
@implementation WPFLyricParser

+ (NSArray *)parserLyricWithFileName:(NSString *)fileName {
    
    // 根据文件名称获取文件地址
    NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
    
    // 根据文件地址获取转化后的总体的字符串
    NSString *lyricStr = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
    
    // 将歌词总体字符串按行拆分开,每句都作为一个数组元素存放到数组中
    NSArray *lineStrs = [lyricStr componentsSeparatedByString:@"\n"];
    
    // 设置歌词时间正则表达式格式
    NSString *pattern = @"\\[[0-9]{2}:[0-9]{2}.[0-9]{2}\\]";
    NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
    
    // 创建可变数组存放歌词模型
    NSMutableArray *lyrics = [NSMutableArray array];
    
    // 遍历歌词字符串数组
    for (NSString *lineStr in lineStrs) {
        
        NSArray *results = [reg matchesInString:lineStr options:0 range:NSMakeRange(0, lineStr.length)];
        
        // 歌词内容
        NSTextCheckingResult *lastResult = [results lastObject];
        NSString *content = [lineStr substringFromIndex:lastResult.range.location + lastResult.range.length];
        
        // 每一个结果的range
        for (NSTextCheckingResult *result in results) {
            
            NSString *time = [lineStr substringWithRange:result.range];

            #warning 对于 NSDateFormatter 类似的重大开小对象,最好使用单例管理
            NSDateFormatter *formatter = [NSDateFormatter sharedDateFormatter];
            formatter.dateFormat = @"[mm:ss.SS]";
            NSDate *timeDate = [formatter dateFromString:time];
            NSDate *initDate = [formatter dateFromString:@"[00:00.00]"];
            
            // 创建模型
            WPFLyric *lyric = [[WPFLyric alloc] init];
            lyric.content = content;
            // 歌词的开始时间
            lyric.time = [timeDate timeIntervalSinceDate:initDate];
            
            // 将歌词对象添加到模型数组汇总
            [lyrics addObject:lyric];
        }
    }
    
    // 按照时间正序排序
    NSSortDescriptor *sortDes = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:YES];
    [lyrics sortUsingDescriptors:@[sortDes]];
   
    return lyrics;
}

@end
复制代码

 5:UIWebView加载POST请求

 NSURL *url = [NSURL URLWithString: @"http://your_url.com"];
NSString *body = [NSString stringWithFormat: @"arg1=%@&arg2=%@", @"val1",@"val2"]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url]; 
[request setHTTPMethod: @"POST"];
[request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]]; 
[webView loadRequest: request];  

 

posted @   踏浪帅  阅读(546)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2011-10-19 面向接口编程详解——编程实例--(T2噬菌体)
2011-10-19 SQL Express自动备份
点击右上角即可分享
微信分享提示