0%

WKWebview本身不支持捏合手势,但是如果把WKWebview放到ScrollView上面,由于ScrollView支持捏合手势,导致WKWebview的内容会支持捏合手势。这种情况下要禁止WKWebview捏合手势就需要添加如下代码:

1
2
3
4
5
- (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation
{
NSString *javascript = @"var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);";
[webView evaluateJavaScript:javascript completionHandler:nil];
}
阅读全文 »

总结一下最近项目中由于语音播报功能中遇到的坑和解决方案。

功能需求

在用户产生交易记录后,后台发送推送消息给登录的用户,用户收到推送消息后,对消息内容进行语音播报。

功能实现

1. 推送功能

推送功能相对简单,项目中集成了极光推送,就极光推送中遇到的坑做个简单记录:

  1. 生成别名不成功:别名传入的参数必须确保是字符串类型,检查是否有类型错误。

    阅读全文 »

如果要在App内简单地实现语音播报功能,使用AVSpeechSynthesizer就可以实现:

1
2
3
4
5
6
7
AVSpeechSynthesizer *speechSynthesizer = [[AVSpeechSynthesizer alloc]init];
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:@"语音播报的内容"];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
CGFloat rate = 0.5;
utterance.rate = rate;
utterance.preUtteranceDelay = 0.0;
[speechSynthesizer speakUtterance:utterance];

值得注意的是,在不同的iOS版本的设备上语音速度有所不同。正常的语速设置:

阅读全文 »

initialize方法

  • 当程序向一个类或者它的子类第一次发消息的时候,runtime会向该类发送initialize消息。

  • 如果super class之前没有收到过initialize消息,会首先调用super classinitialize,然后才当前classinitialize.

  • 如果当前类没有实现initializie,则对当前class的initialize会转发调用super class的initialize,所以会出现一个initialize的实现被多次调用的情况,为了避免这种情况,可以采用如下写法:

    阅读全文 »

  1. 自适应屏幕宽度

    在创建WKWebview时,添加js:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name','viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";

    WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    WKUserContentController *wkUController = [[WKUserContentController alloc] init];
    [wkUController addUserScript:wkUScript];

    WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
    wkWebConfig.userContentController = wkUController;

    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:wkWebConfig];
    webView.backgroundColor = [UIColor clearColor];
    webView.UIDelegate = self;
    webView.navigationDelegate = self;
    [self.view addSubview:webView];
    self.webView = webView;
    阅读全文 »

使用xib创建的cell、header、footer的register问题

通常向collectionView注册cell、header、footer时,我们会使用:

1
2
3
4
5
[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellId];

[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerId];

[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:footerId];

但是,如果cell、header、footer是使用xib创建的,就会发现这样注册到collectionView,collectionView的内容展示不出来。这时候就需要使用Nib文件来实现:

阅读全文 »

最近写项目时,发现了一个问题:

使用presentViewController方法present到一个包含childViewControllers的containerController时,containerController的childViewConroller是一个xib创建的viewControllerA,present之后,ViewControllerA的frame等于ViewControllerA的xib尺寸,而不是屏幕大小(比如,ViewControllerA的xib尺寸是375x667,在7 Plus上展示的时候,得到的ViewControllerA仍然是375x667);而同样是作为childViewController的ViewControllerB用纯代码创建,则能够按照屏幕尺寸正确展示。

解决方法:
阅读全文 »

FMDB以OC的方式封装了SQLite的C语言API。所以相对使用底层语言实现的Sqlite来说,FMDB主要有以下优点:

  • 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码;

  • 对比苹果自带的Core Data框架,更加轻量级和灵活;

  • 提供了多线程安全的数据库操作方法,有效地防止数据混乱。

    阅读全文 »

Core Location框架用来确定设备物理位置。

Map Kit框架用于创建实时交互地图来显示想要的位置。

Core Location通过三种技术来实现定位功能:GPS、蜂窝基站ID定位(cell ID Location)和WPS(WIFI Position Service,WIFI定位服务)。其中,GPS定位是最精确的。

  • GPS:GPS通过读取来自多个卫星的微波信号来确定当前位置。苹果公司使用的GPS为Assisted GPS(辅助全球卫星定位系统),也称A-GPS。A-GPS使用网络资源来帮助改进纯粹的GPS性能,其基本原理是通信运营商部署网络服务,移动设备会自动寻找并从中收集数据,这样移动设备能够只依靠GPS卫星更快地确定它的起始位置。
    阅读全文 »