如何获取当前启动图(LaunchImage)的图片文件名

1、通过获取全局info.plist中的UILaunchImages属性,这是一个字典,大概格式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<__nsarraym 0x6000002413b0>(
{
    UILaunchImageMinimumOSVersion = "8.0";
    UILaunchImageName = "LaunchImage-800-Portrait-736h";
    UILaunchImageOrientation = Portrait;
    UILaunchImageSize = "{414, 736}";
},
{
    UILaunchImageMinimumOSVersion = "8.0";
    UILaunchImageName = "LaunchImage-800-667h";
    UILaunchImageOrientation = Portrait;
    UILaunchImageSize = "{375, 667}";
},
{
    UILaunchImageMinimumOSVersion = "7.0";
    UILaunchImageName = "LaunchImage-700";
    UILaunchImageOrientation = Portrait;
    UILaunchImageSize = "{320, 480}";
},
{
    UILaunchImageMinimumOSVersion = "7.0";
    UILaunchImageName = "LaunchImage-700-568h";
    UILaunchImageOrientation = Portrait;
    UILaunchImageSize = "{320, 568}";
}
)</__nsarraym>

2、遍历这个数组,找到图片尺寸为当前屏幕尺寸的字典,取出文件名即可
3、封装成工具类方法[……]

继续阅读

自定义计时器,通过dispatch_after()实现

1、设计思路

1.1、系统类NSTimer做一次性计时使用还可以,如果需要暂停继续的话就不太灵活了;
1.2、通过dispatch_after延时执行函数,配套循环语句算法实现间隔n秒触发一次调用;
1.3、设计一个状态属性,对当前的状态进行管理,如准备、暂停、继续、开始、结束等;

2、相关属性与方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//
//  SATimer.h
//  Test
//
//  Created by 余西安 on 16/8/11.
//  Copyright ? 2016年 Sian. All rights reserved.
//
 
#import <Foundation/Foundation.h>
// 定时器状态
typedef NS_ENUM(NSInteger, SATimerStatus){
    SATimerStatusReady = 0, // 准备
    SATimerStatusRunning,   // 正在运行
    SATimerStatusPaused,    // 已暂停,可继续计时
    SATimerStatusStoped     // 已停止,只能重新开始
};
 
typedef void (^SATimerBlock)(NSUInteger remainCount);
 
@interface SATimer : NSObject
// 间隔时间
@property (nonatomic, assign) NSTimeInterval interval;
// 重复次数
@property (nonatomic, assign) NSUInteger     repeatCount;
 
@property (nonatomic, assign) SATimerStatus  status;
 
+ (instancetype)timeWithInterval:(NSTimeInterval)ti repeatCount:(NSInteger)count block:(SATimerBlock)block;
 
- (instancetype)initWithInterval:(NSTimeInterval)ti repeatCount:(NSInteger)count block:(SATimerBlock)block;
// 开始(重新开始)
- (void)start;
// 暂停(可继续)
- (void)pause;
// 继续
- (void)continues;
// 停止(不可继续,只能重新开始)
- (void)stop;
 
@end

3、实现[……]

继续阅读

Xcode8运行时的一些log日志是怎么回事

1、升级Xcode8之后,原项目运行时在控制台多出了一些日志信息,如下所示:

1
2016-09-18 15:38:17.290635 Test[1243:287383] subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_lev[......]<p class="read-more"><a href="https://www.yusian.com/blog/analysis/2016/09/18/154828778.html">继续阅读</a></p>

-QQAPI- QQApi.m:428 param error: nil object

0、先说现象:找开App在使用QQ分享时提示“参数错误”,第一次分享时都会这样,重复操作一切正常!

1、正常情况下项目中使用QQ分享功能,只需要创建分享对象,然后调用接口分享即可,官方代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
NSString *utf8String = @"http://www.163.com";
NSString *title = @"新闻标题";
NSString *description = @"新闻描述";
NSString *previewImageUrl = @"http://cdni.wired.co.uk/620x413/k_n/NewsForecast%20copy_620x413.jpg";
QQApiNewsObject *newsObj = [QQApiNewsObject
                            objectWithURL:[NSURL URLWithString:utf8String]
                            title:title
                            description:description
                            previewImageURL:[NSURL URLWithString:previewImageUrl]];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];
//将内容分享到qq
//QQApiSendResultCode sent = [QQApiInterface sendReq:req];
//将内容分享到qzone
QQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];

2、然而官方没有提醒你,在此之前必须先将TencentOAuth对象实例化,即必须先执行以下代码:

1
self.oauth = [[TencentOAuth alloc] initWithAppId:kSAAppID_QQ andDelegate:self];

3、理论上有这些就足够了,但事实并非如此,比如说官方的Demo在分享时控制台会有一个logo输出[……]

继续阅读