小编jar*_*air的帖子

UIBarButtonItem在用作左侧或右侧导航栏项目时,自定义视图未在iOS 7上正确对齐

以下代码通过iOS 6运行:

UIButton *myButton = nil;
myButton = [UIButton buttonWithType:UIButtonTypeCustom];
myButton.bounds = CGRectMake(0,0,44,30);
// setup myButton's images, etc.

UIBarButtonItem *item = nil;
item = [[UIBarButtonItem alloc] initWithCustomView:customButton];
Run Code Online (Sandbox Code Playgroud)

这是按钮应该如何对齐:

正常定位

但是,在iOS 7上,按钮似乎从右侧或左侧偏移了太多像素:

iOS 7上的定位不正确

如何才能使我的自定义条形按钮项目正确对齐?

uinavigationbar uibutton uibarbuttonitem uinavigationitem ios7

75
推荐指数
4
解决办法
6万
查看次数

从横向方向从iPhone 6 Plus主屏幕启动纵向导致错误的方向

这个问题的实际标题比我可能适合的长:

启动一个应用程序,其根视图控制器仅支持纵向,但在主屏幕处于横向方向时支持iPhone 6 Plus上的横向方向会导致应用程序窗口处于横向方向但设备为在纵向方向.

简而言之,它看起来像这样:

当它应该看起来像这样:

重现步骤:

  1. iPhone 6 Plus运行iOS 8.0.

  2. 一个应用程序,其plist支持所有但纵向倒置的方向.

  3. 应用程序的根视图控制器是UITabBarController.

  4. 一切,标签栏控制器及其所有后代子视图控制器都UIInterfaceOrientationMaskPortrait从中返回supportedInterfaceOrientations.

  5. 从iOS主屏幕开始.

  6. 旋转至横向(需要iPhone 6 Plus).

  7. 冷启动应用程序.

  8. 结果:界面方向损坏.

除了完全禁用横向之外,我无法想到强制执行纵向定位的任何其他方式,这是我无法做到的:我们的网络浏览器模态视图控制器需要横向.

我甚至尝试了子类化UITabBarController并重写supportedInterfaceOrientations以返回仅限纵向的掩码,但是这(即使使用上述所有其他步骤)也没有解决问题.


这是一个显示错误的示例项目的链接.


iphone uiinterfaceorientation ios ios8

59
推荐指数
3
解决办法
3万
查看次数

从UIFontDescriptor创建UIFont时忽略UIFontWeightTrait和UIFontDescriptorFamilyAttribute

鉴于以下代码和运行iOS 7.1或更高版本的设备:

 NSDictionary *fontTraitsDictionary = @{UIFontWeightTrait : @(-1.0)};
 NSDictionary *attributesDictionary = @{
                                       UIFontDescriptorFamilyAttribute : @"Helvetica Neue", 
                                       UIFontDescriptorTraitsAttribute : fontTraitsDictionary
                                       };
 UIFontDescriptor *ultraLightDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:attributesDictionary];
 UIFont *shouldBeAnUltraLightFont = [UIFont fontWithDescriptor:ultraLightDescriptor size:24];

 NSLog(@"%@", shouldBeAnUltraLightFont);
Run Code Online (Sandbox Code Playgroud)

我希望它的值是shouldBeAnUltraLightFontHelveticaNeue-UltraLight的一个实例,但它是:

<UICTFont: 0x908d160> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 24.00pt
Run Code Online (Sandbox Code Playgroud)

据我所知,我正在关注Apple文档.为什么完全忽略字体系列和字体粗细信息?

我试过的事情

无论这些更改如何,返回的字体始终是正常重量的Helvetica的香草实例.

uifont ios7 uifontdescriptor uifontweighttrait

21
推荐指数
2
解决办法
5321
查看次数

如何保证主机应用程序和扩展程序使用的共享应用程序容器中的Core Data存储中的唯一条目?

为了有效地提出我的问题,我们首先考虑一下我面临的确切情况:

常规设置

  • 主机iOS 8应用程序.
  • 与主机应用程序捆绑在一起的一个或多个iOS 8扩展(WatchKit,Share等).
  • 主机应用程序和所有扩展程序在共享应用程序组容器中共享相同的Core Data SQLite存储.
  • 每个app/extension都有自己的NSPersistentStoreCoordinator和NSManagedObjectContext.
  • 每个持久性存储协调器使用持久性存储,该存储在组容器中与所有其他持久性存储共享相同的SQLite资源.
  • 应用程序和所有扩展使用公共代码库来同步Internet上远程API资源的内容.

导致问题的事件顺序

  1. 用户启动主机应用程序.它开始从远程API资源获取数据.核心数据模型对象基于API响应创建,并"upserted"到主机应用程序的托管对象上下文中.每个API实体都有一个uniqueID,用于在远程API后端中标识它.通过"upsert",我的意思是,对于每个API实体,主机应用程序仅在无法找到给定唯一ID的现有条目时在Core Data中创建新条目.

  2. 同时,用户还启动了一个主机应用程序的扩展.它也可以从同一个远程API执行某种提取.它还尝试在解析API响应时执行"upsert".

  3. 问题:如果主机应用程序和扩展程序同时尝试为同一API实体插入Core Data条目,会发生什么?要了解这是如何产生的,让我们看看upsert的事件序列:

核心数据Upsert序列:

  1. API解析代码解析给定API实体的uniqueID.
  2. 解析器为与谓词匹配的任何条目执行核心数据提取,其中谓词uniqueID等于已解析的唯一ID.
  3. 如果找不到现有条目,则解析器会为此API实体插入新的Core Data条目,将其uniqueID属性设置为已解析的uniqueID.
  4. 解析器保存托管对象上下文,该上下文将新条目数据下推到SQLite后备存储.

问题详情

假设主机应用程序和扩展程序同时独立地解析同一API实体的API响应.如果主机应用程序和扩展程序在它们中的任何一个完成步骤4之前到达步骤3,则它们都将尝试为相同的唯一ID插入新的核心数据条目.当他们到达步骤4并调用save:他们各自的托管对象上下文时,Core Data将很乐意创建重复的条目.

据我所知,Core Data没有任何方法可以将属性标记为唯一.我需要一个等同于SQLite INSERT OR IGNORE+ UPDATE组合的核心数据..或者我需要一种方法来"锁定"持久存储的SQLite后备存储,这听起来像是一个麻烦的方法.

对iOS 8扩展引入的这个相当新颖的问题有一个已知的方法吗?

sqlite core-data ios watchkit ios-extensions

18
推荐指数
2
解决办法
3032
查看次数

尽管所有构建设置都相反,Xcode Instruments正在剥离符号

问题

仪器的Time Profiler正在从我的应用程序中剥离除系统库之外的所有符号,尽管事实上我已经在Xcode的所有相关构建设置中禁用了这种行为 - 但仅在一台开发机器上.另一台开发机器正常运行.

描述

仪器的Time Profiler正在剥离除系统库之外的所有符号,尽管事实上我已经在Xcode的所有相关构建设置中禁用了这种行为 - 但这只发生在我的一台开发机器上.我已经运行OS X时,Xcode和仪器的同一版本二次开发的机器,每台机器使用具有相同构建设置,方案和其他配置相同的Xcode项目的相同副本,并且应用程序正在使用相同的异形测试设备(iPhone 4S与iOS 5的最新公开版本).

机器1
- Mac OS X
10.7.4 - Xcode 4.3.2(4E2002)
- 仪器4.3(4321)

机器2
- Mac OS X
10.7.4 - Xcode 4.3.2(4E2002)
- 仪器4.3(4321)

重现步骤

  1. 在每台机器上打开包含的示例项目.
  2. 确保选择iPhone 4S作为测试设备.
  3. 选择产品>配置文件
  4. 当仪器启动时,选择Time Profiler并继续.
  5. 运行应用程序.
  6. 请注意在iMac(机器1)上运行时如何剥离符号,而不是在MacBook Air(机器2)上运行.

预期的行为

我自己的代码中的符号应该出现在两台机器上的Time Profiler中.

回归

我尝试了以下所有方法,但实际结果没有变化:

  1. 重新启动机器.

  2. 尝试其他Xcode项目

  3. 删除Xcode Organizer中所有项目的"派生数据".

  4. 重新标记仪器中的文档(在〜/ Library/blahBlahBlah中仔细选择正确的DSYM文件......)

最后的笔记

以下是示例项目的.zip文件的链接:Sample Project .zip

xcode symbols instruments stripping

13
推荐指数
1
解决办法
7894
查看次数

Xcode Organizer设备状态"TakingInstallLock"并挂起,只有治愈才能完全恢复iOS

我正在构建使用UILocalNotifications进行警报的应用程序.为了测试调度逻辑,我经常需要按分钟或小时的增量更改系统时间,或者更改时区等.

问题是,在几次会话之后,管理器设备选项卡会显示一个名为"TakingInstallLock"的状态,并在进度指示器中无限期挂起.

1)这是由更改系统时间引起的吗?2)如果没有,那又怎样?3)或者如果是,我怎样才能测试间隔几分钟到几周间隔的UILocalNotifications?

xcode timezone hang uilocalnotification xcode-organizer

8
推荐指数
3
解决办法
4303
查看次数

使用LTE在Apple Watch上发出URLSession请求时,"Internet连接似乎处于脱机状态"

错误:

我一直收到错误代码-1009"Internet连接似乎处于脱机状态." 在通过LTE连接到Internet时,在Apple Watch Series 3上的Apple Watch扩展中发出URLSession请求时出错.

重现步骤:

  1. 安装应用程序.
  2. 配置您的设备,使其仅在LTE上.
  3. 使用iMessages验证您与LTE的连接,例如
  4. 启动应用程序.
  5. 使用.default或.ephemeral会话配置初始化URLSession.
  6. 为任何已知良好的https URL发出数据任务请求.

预期行为:

请求设法到达目的地.

观察到的行为:

请求立即失败,错误代码为-1009"Internet连接似乎处于脱机状态".

代码示例:

let config = URLSessionConfiguration.ephemeral
let sesh = URLSession(configuration: config)
let url = URL(string: "https://google.com")!
sesh.dataTask(with: request) { (_, _, error) in
    print(error)
}.resume()
Run Code Online (Sandbox Code Playgroud)

cellular-network lte nsurlsession watchkit watchos-4

8
推荐指数
1
解决办法
2680
查看次数

NSMutableParagraphStyle忽略了NSWritingDirectionNatural,默认为LTR为阿拉伯语文本

我正在使用NSAttributedString UIKit Additions在UIView中绘制属性字符串.我的问题是,尽管使用的价值NSWritingDirectionNaturalbaseWritingDirection我的段落样式属性,文本始终默认为左到右.

这是我如何形成属性字符串(简化):

NSString *arabic = @"??????? ??????? ???????? ?????? ????? ??????? ?????? ?????. ???? ??? ????? ???? ?????? ?????? ???????? ????? ???? ??? ??? ?? ?????? ?????? ???? ?????? ??? ?????????? ???????? ???????";

NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.baseWritingDirection = NSWritingDirectionNatural;
paragraph.lineBreakMode = NSLineBreakByWordWrapping;

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
attributes[NSParagraphStyleAttributeName] = paragraph;

NSAttributedString *string = [[NSAttributedString alloc] 
                             initWithString:arabic 
                             attributes:attributes];
Run Code Online (Sandbox Code Playgroud)

以下是我绘制文字的方式:

- (void)drawRect:(CGRect)rect {
    [self.attributedText drawWithRect:rect 
                              options:NSStringDrawingUsesLineFragmentOrigin 
                              context:nil];
}
Run Code Online (Sandbox Code Playgroud)

但它仍然从左向右流动:

截图

我错过了什么?

uikit nsattributedstring right-to-left

7
推荐指数
1
解决办法
954
查看次数

在Prefix.pch中包含一个constants.h文件会破坏代码完成,语法高亮

我的应用程序有很多常量(kvo键,枚举等),几乎每个类都使用它们.我有一个constants.h文件,包含所有这些文件.我想在Prefix.pch文件中包含此文件,如下所示:

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "AppConstants.h"
#endif
Run Code Online (Sandbox Code Playgroud)

但是,当我以这种方式包含文件时,Xcode 4的语法突出显示和代码完成停止工作.如果我在每个使用它们的类的头文件中手动包含constants文件,并从pch文件中删除include,则会返回语法突出显示和代码完成.

这是预期的行为吗?如何在不使用pch文件的情况下在每个文件中包含常量文件?由于pch文件,"AppConstants.h"文件本身是否包含在内的问题是什么?

syntax-highlighting constants pch code-completion xcode4

3
推荐指数
1
解决办法
2118
查看次数

UNUserNotificationCenter.current().requestAuthorization() 可以多次调用吗?

UNUserNotificationCenter.current().requestAuthorization() 可以多次调用吗?

  • 我可以在每次应用程序启动时调用吗?
  • 用户授予通知权限后可以再次调用吗?
  • 如果没有,为什么不呢?

apple-push-notifications ios unusernotificationcenter unusernotification

3
推荐指数
1
解决办法
1373
查看次数