小编Tim*_*ber的帖子

在Xcode 6/iOS 8界面生成器启动屏幕上使用自定义字体

我正在使用Xcode 6的基于界面构建器的新发布图像,并且遇到了一个问题.

我通过选择New File,Launch Screen创建了一个新的界面构建器文件,它.xib在我的项目中创建了一个文件.

启动屏幕创建

然后我设计了我的启动画面,一切都很好,除了:我有一个自定义字体,我已经UILabel在Interface Builder中分配了它.字体适当地出现在Interface Builder中,但当.xib用于生成启动图像时,使用系统字体.

有任何想法吗?

更新2014-09-16

我在Twitter上从@flo_muc那里学到了一些可能相关的东西:

"TIL:iOS 8拥有自己的deamon,用于显示基于xib的启动图像,名为splashboardd.所以这个xib在你的范围之外运行."

xcode fonts interface-builder uilabel ios

39
推荐指数
1
解决办法
2万
查看次数

drawViewHierarchyInRect:afterScreenUpdates:延迟其他动画

在我的应用程序中,我使用drawViewHierarchyInRect:afterScreenUpdates:以获取我的视图的模糊图像(使用Apple的UIImage类别UIImageEffects).

我的代码看起来像这样:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
Run Code Online (Sandbox Code Playgroud)

我在开发过程中注意到,在使用我的应用程序之后,我的许多动画都被延迟了,即,与应用程序的全新启动相比,我的视图在显着(但不到大约一秒)暂停之后开始动画.

经过一些调试后,我注意到仅使用drawViewHierarchyInRect:afterScreenUpdates:屏幕更新设置YES导致此延迟.如果在使用会话期间从未发送此消息,则永远不会出现延迟.使用NO的屏幕更新参数也做出了延迟消失.

奇怪的是,这个模糊的代码延迟的动画完全无关(据我所知).有问题的动画不使用 drawViewHierarchyInRect:afterScreenUpdates:,它们是CAKeyframeAnimation动画.仅发送此消息(屏幕更新设置为YES)的行为似乎在我的应用程序中全局影响了动画.

这是怎么回事?

(我创建了说明效果的视频:没有动画延迟.请注意导航栏中"Check!"语音气泡的外观延迟.)

UPDATE

我已经创建了一个示例项目来说明这个潜在的错误.https://github.com/timarnold/AnimationBugExample

更新2号

我收到Apple的回复,证实这是一个错误.见下面的答案.

cocoa-touch core-animation objective-c ios

27
推荐指数
1
解决办法
2万
查看次数

如何在放弃Wi-Fi网络时在iOS中获取可达性通知?

我正在成功使用Reachability来确定网络的状态,并获得有关更改的通知(例如iOS 4的可达性指南).

我的问题不是如何让Reachability启动和运行,而是如下.

AppDelegate处理可达性的东西.应用kReachabilityChangedNotification程序运行时以及应用程序位于Background(applicationDidEnterBackground:)时,应用程序会收到通知().

该应用程序旨在重新加载播放的音频流,当它注意到它丢失了一个Wi-Fi连接,例如,为了测试,我在设置中打开和关闭Wi-Fi,一切都运行良好.在实际测试中,当我退出接入点的范围时,我经常会失去Wi-Fi连接.我发现在这种情况下,Reachability并没有帮助我太多.我不确定是不是因为当屏幕被锁定时,可达性通知没有通过,或者可达性无法处理来自越来越远的Wi-Fi接入点的信号缓慢减少,但无论我无法想象为什么现实世界的测试与理想化的案例不符.

这就是我的代码.我首先设置接收通知,然后开始收听Reachability:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(checkNetworkStatus:) 
                                                 name:kReachabilityChangedNotification object:nil];

    // Set up Reachability
    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];    

    ....

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

然后,这是响应连接变化的函数:

- (void)checkNetworkStatus:(NSNotification *)notice {
    // called after network status changes

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is …
Run Code Online (Sandbox Code Playgroud)

networking reachability ios

24
推荐指数
1
解决办法
2万
查看次数

UIRefreshControl由我的UINavigationController的UINavigationBar隐藏/隐藏

我试图使用一个UIRefreshControl内部我UITableViewController自己在里面UINavigationController,它的hidesNavigationBar属性设置为NO(所以导航栏是可见的).

UIRefreshControl作品,但被掩盖UINavigationBar.我很惊讶我找不到其他遇到这个问题的人.

可能的相关要点:

  • rootViewController认为我UIWindow是我的UINavigationController.
  • UINavigationController通过设置viewControllers属性来设置初始视图控制器UINavigationController.
  • 我的UITableViewController子类用nib实例化.
  • UIRefreshControlviewDidLoad我的UITableViewController子类的方法中实例化我.我在这个方法中设置了子类的refreshControl属性UITableViewController.
  • UIRefreshControl工作完全正常,我可以看到它的一部分,但它是由我的遮蔽UINavigationBar.如果我设置hidesNavigationBarYES(但我不想隐藏它),这看起来完全正常.

编辑:

用于创建和定位我的代码UIRefreshControl是:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self 
                   action:@selector(toggleRefresh:) 
         forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
Run Code Online (Sandbox Code Playgroud)

这段代码片段在viewDidLoad我的UITableViewController子类的方法中,它是一个子视图控制器UINavigationViewController.

cocoa-touch uitableview uinavigationcontroller ios uirefreshcontrol

18
推荐指数
1
解决办法
7927
查看次数

动态模拟iOS动态类型系统文本大小(UIContentSizeCategory)

我想用不同的系统文本大小选项轻松测试我的应用程序,包括可访问性大小.这些可以在"设置"应用中设置(显示和亮度=>文字大小或常规=>辅助功能=>较大文本).

我目前可以找到的唯一方法是进入设置并使用UI更改值(编辑:下面描述的部分解决方案).这很慢而且很麻烦.我怀疑有一种方法可以使用私有API动态地改变它,但我无法弄清楚如何.由于我的目标是仅将其用于调试,因此私有API使用和调配很好(此代码不会用于生产).

为了尝试找到一个私有API来实现这一点,我查看了一些逆向工程资源.我是新的反汇编程序,符号表,类转储,以及查找我可以使用的私有API,但这是我到目前为止所尝试的:

  • 我成功地调高了-[UIApplication preferredContentSizeCategory](其他帖子说这在过去有效),但这不会影响从中返回的结果+[UIFont preferredFontForTextStyle:].

  • 使用反汇编程序IDA,我发现它+[UIFont preferredFontForTextStyle:]位于私有框架中UIFoundation.framework.(-[UIApplication preferredContentSizeCategory]在,UIKit.framework但反汇编并没有看起来有用).

  • 正如我开始写这个问题(它总是这样发生),我发现了一个部分解决方案.可以在方案中设置启动参数以在启动时设置值.这很有用,但不是我追求的.

  • 通过上面的回答,我发现用户偏好的值显然存储在" com.apple.UIKit.plist位于模拟器data/Library/Preferences目录中的文件"中.我们所追求的值可以从命令行实用程序设置plutil.这也是一种改进!但是我想在运行时动态地改变它.

更多关于IDA的结果:

我真的不知道如何阅读反汇编,但+[UIFont preferredFontForTextStyle:]似乎指向一个符号___UIFontForTextStyle,它似乎指向一些有趣的符号,称为_getUIContentSizeCategoryUnspecified_getUIContentSizeCategoryPreferenceClass

<code>nm</code></a>上<code>UIFoundation.framework</code>.它们用小写字母"符号在小对象的未初始化数据部分中." .我不知道这意味着什么(我收集到的只是他们不是一个阶级或方法).

在网上搜索_getUIContentSizeCategory...符号不会产生任何结果,但附近还有另一个符号_getUIApplicationClass.我搜索了那个,因为它听起来更一般,并在一些WebKit源代码中发现了类似的东西.可能一无所获,但也许这是Apple的内部约定.无论如何,这个例子并没有真正帮助我解决问题.

无论如何感谢阅读到目前为止.如果你还在这里,我的问题是:

我希望能够动态模拟动态类型大小首选项的值.这些反汇编符号可能有所帮助,但也许我走错了路.感觉解决方案很接近,但我不能将所有部分放在一起.

将此值设置为启动参数很好,但不能完全解决我的问题.同样,修改模拟器的值plist也很适合自动化,但不能解决我的问题.

有没有办法在运行时动态更改此值?

objective-c disassembly iphone-privateapi uifont ios

15
推荐指数
1
解决办法
818
查看次数

Game Center属性中的Game Center GKTurnBasedMatch问题

我正在用GKTurnBasedMatch匹配创建一个游戏中心游戏.我遇到的问题是,a上的readonly matchData属性GKTurnBasedMatch似乎没有正确存储在Game Center服务器上.

我正在使用此StackOverflow应答来生成md5校验和matchData NSData,无论是在向Game Center服务器发送还是从Game Center服务器接收时.

NSData当我matchData使用GKTurnBasedMatch实例方法发送时,我注意到我的游戏数据对象的校验和endTurnWithNextParticipants:turnTimeout:matchData:completionHandler:.

然后对手使用GKTurnBasedMatch's class方法检索匹配loadMatchesWithCompletionHandler:,当匹配到达(没有错误)时,我再次记下校验和.

两个校验和不匹配,并且基于重建的游戏,得到的数据明显不相同.我已经检查了两个帐户,matchID我的GKTurnBasedMatch对象上的属性是相同的.

我还进行了以下测试:

NSLog(@"matchID: %@ matchData checksum: %@",
                    match.matchID, 
                    [Utilities md5StringFromData:match.matchData]);

// match is a valid `GKTurnBasedMatch` object.
[match endTurnWithNextParticipants: @[ opponent ] // My `GKTurnBasedParticipant` opponent
                       turnTimeout:600
                         matchData:data // This is a valid NSData object
                 completionHandler:^(NSError *error) {
                      if (nil != error) {

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

cocoa objective-c gamekit ios game-center

11
推荐指数
1
解决办法
1420
查看次数

使用iOS 7 API进行UICollectionView交互式布局转换

我正在尝试处理新的iOS 7 API,它允许交互式动画视图控制器转换,包括UICollectionViewLayouts 之间的转换.

我已经从WWDC 2013"iOS-CollectionViewTransition"中获取并修改了示例代码,可在此处找到:https://github.com/timarnold/UICollectionView-Transition-Demo

原始演示在我找到它时未处于工作状态,可通过Apple Developer帐户访问,网址为:https://developer.apple.com/downloads/index.action?name = WWDC%202020

我的应用程序版本提供了一个包含两个布局的集合视图,两个布局都UICollectionViewFlowLayout具有不同的属性.

在第一个布局中点击一个单元格正确地动画到第二个,包括,至关重要的是,在新布局中滚动到的项目.起初我对新集合视图如何知道设置其内容偏移以使适当的单元格可见感到困惑,但我了解到它基于selected呈现集合视图的属性来做到这一点.

捏在某个项目中的第一个布局为动画,使用UICollectionViewTransitionLayout,UIViewControllerAnimatedTransitioningUIViewControllerInteractiveTransitioning,新的布局,以及.这样可以工作,但是在新布局或过渡布局中,压缩单元格不会滚动到该单元格.

我已经尝试selected在不同位置上的pinched-on单元格上设置属性(尝试模仿在点击某个项目时所描述的行为以推动新的视图控制器),但无济于事.

有关如何解决这个问题的任何想法?

iphone cocoa-touch ios uicollectionview uicollectionviewlayout

10
推荐指数
1
解决办法
2万
查看次数

使用NSString方法进行神秘崩溃rangeOfComposedCharacterSequenceAtIndex:

我的应用程序使用了几个UITextView,我们正在收到用户无法重现的崩溃报告.

崩溃报告(似乎)不包含任何代码,并且NSInvalidArgumentExceptionNSString方法中崩溃rangeOfComposedCharacterSequenceAtIndex:,而我们的代码不会直接调用它,但似乎是由框架调用.

这是崩溃报告:

0  CoreFoundation    __exceptionPreprocess + 130
1 libobjc.A.dylib    objc_exception_throw + 38
2  CoreFoundation    -[NSException initWithCoder:]
3  Foundation        -[NSString rangeOfComposedCharacterSequenceAtIndex:] + 88
4  UIKit             __74-[UITextInputController _validCaretPositionFromCharacterIndex:downstream:]_block_invoke + 328
5  UIFoundation      -[NSTextStorage coordinateReading:] + 36
6  UIKit             -[UITextInputController _validCaretPositionFromCharacterIndex:downstream:] + 218
7  UIKit             __52-[UITextInputController _characterPositionForPoint:]_block_invoke + 1112
8  UIFoundation      -[NSLayoutManager(TextLocking) coordinateAccess:] + 46
9  UIKit             -[UITextInputController _characterPositionForPoint:] + 224
10 UIKit             -[UITextSelection setSelectionWithFirstPoint:secondPoint:] + 56
11 UIKit             -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) twoFingerRangedSelectGesture:] + 386
12 …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch objective-c nsstring ios

9
推荐指数
1
解决办法
1364
查看次数

使用`estimatedRowHeight`和`UITableViewAutomaticDimension`时,`moveRowAtIndexPath:toIndexPath:`中的UITableViewCell动画错误

当使用moveRowAtIndexPath:toIndexPath:移动a时UITableViewCell,我在使用时看到动画故障estimatedRowHeight,UITableViewAutomaticDimension当单元格从可见状态动画到不可见状态时.

如果我通过实现明确设置单元格的高度,问题就会消失tableView:heightForRowAtIndexPath:.仅当源索引路径和目标索引路径分别可见且不可见时,才会出现此问题.当单元格移动到另一个可见索引路径时,动画将按预期运行.

我已经创建了一个示例项目来说明效果:https://github.com/timarnold/Table-Cell-Sizing-Bug

http://www.openradar.me/19156703

编辑

@rdelmar指出我的问题实际上并没有问一个问题.

有没有人知道解决这个bug的方法并修复这种行为?或者我做错了什么?

编辑2014-12-08

我使用Apple提供的一个开发人员支持票来询问Apple的这个问题.他们证实这是一个错误(请访问http://www.openradar.me/19156703),并没有提供任何解决方法.

animation objective-c uitableview ios

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

`-costToNode:`没有发送到GameplayKit中的GKGraphNode2D子类

我对Apple的新GameplayKit有一个愚蠢的问题.

我正在为我的游戏创建一个基于2D网格的节点布局.我大多喜欢它的功能GKGraphNode2D,但想以一种方式调整它.我想在遍历某种节点对时有条件地添加惩罚.换句话说,我希望一些节点以直接的方式连接,并且一些节点连接起来使得它们的遍历距离被我的app修改.

我认为继承GKGraphNode2D和覆盖-costToNode:,-estimatedCostToNode:并将完美地工作!我super有时会返回提供的值,并在其他时间为我的游戏调整它.这两个方法都是方法GKGraphNode,超类GKGraphdNode2D.

不幸的是,当我尝试这样做时,似乎-costToNode:并且-estimatedCostToNode:永远不会在我的GKGraphNode2D子类上调用它.我希望当我打电话要调用这些方法-findPathFromNode:toNode:我的GKGraph对象,它包含了一堆我的GKGraphNode2D子类的对象.

我究竟做错了什么?

编辑:

以下是我的代码.

创建两个班,CheapNodeExpensiveNode,是的子类GKGraphNode2D,如下所示:

@import UIKit;
@import GameplayKit;

@interface CheapNode : GKGraphNode2D
@end

@implementation CheapNode

- (float)estimatedCostToNode:(GKGraphNode *)node {
    return 1;
}

- (float)costToNode:(GKGraphNode *)node {
    return 1;
}

@end
Run Code Online (Sandbox Code Playgroud)

@import UIKit;
@import GameplayKit;

@interface ExpensiveNode : GKGraphNode2D
@end

@implementation ExpensiveNode

- (float)estimatedCostToNode:(GKGraphNode …
Run Code Online (Sandbox Code Playgroud)

ios gameplay-kit

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

不能使用"Vendored Framework"CocoaPod Inside Workspace Playground

我创建说明我的问题的示例项目在这里.

总之,我正在尝试在工作区游乐场中使用"vendored framework"CocoaPod.我认为这是可能的,但需要对项目设置进行一些调整,我无法弄清楚要改变什么.

要观察示例项目中的问题,请执行以下操作:

  • CocoaPods-Test/CocoaPods-Test.xcworkspace在Xcode中打开.
  • 应该在存储库中安装和提交Pod,但pod install必要时可以运行.
  • 请注意,CocoaPods-Test目标构建并成功运行,导入PromiseKitTwilioChatClientpod.
  • 导航到Playground.playground工作区内.
  • 请注意,在导入时,游乐场执行正常,PromiseKit但如果TwilioChatClient导入,则游乐场执行失败,并且"没有这样的模块'TwilioChatClient'".

阅读以下资源后:

我认为这个问题可能与TwilioChatClient"销售框架"(参见其podspec)有关,这意味着不会为它创建pod目标.在阅读了上述资源后,我觉得解决方案已经触手可及,但我无法弄明白.

虽然这里的示例项目说明了我认为的根本问题,但促使我创建这个示例项目的问题只是稍微复杂一点.

在我的项目中,我创建了一个包含我所有应用程序代码的框架目标(因此可以将其导入我的应用程序,也可以使用应用程序资源导入我的游乐场).然后,该框架具有pod依赖性,包括PromiseKitTwilioChatClient.操场上的执行错误是不同的("无法查找符号"而不是"没有这样的模块"),因为我没有直接导入CocoaPods模块,而是我使用pod框架的框架.

我怀疑如果我能解决"没有这样的模块"问题,它将帮助我解决我的"无法查找符号"问题.

最后,这似乎是一个很好的机会来做出其他人似乎不想做的开源贡献(参见此处的讨论).坦率地说,我很乐意做出贡献,但是在阅读了一下之后(例如这里这里),我觉得我不知道CocoaPods,Xcode构建过程等究竟发生了什么.任何有助于理解Xcode构建过程的引用以及CocoaPods在幕后所做的事情都值得赞赏.看起来我发现的资源要么是"非常高级别的概述"(我得到的),要么"挖掘源代码",而不是介于两者之间.

xcode twilio ios cocoapods swift-playground

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

游戏中心的困境:iTunes Connect?配置文件?别的什么?

我有一些令人困惑的游戏中心问题.

我的应用程序仅在iOS 6及更高版本上运行,我一直在使用标准代码对Game Center进行身份验证:

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler = ^(UIViewController *viewController, 
                                    NSError *error) {
    // Respond to authentication (failure or success) here!
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,该应用程序运行良好,几周没有问题,我自己在开发过程中和~10-15 beta测试人员在临时发行版中.

在大多数情况下,对于大多数用户而言,该应用程序的行为与您期望的一样:如果您在应用程序启动时未登录游戏中心,或者登录到生产游戏中心帐户,应用程序会提示您(使用模式以游戏中心为主题的View Controller)使用Sandbox帐户登录.您登录到您的沙盒帐户,以及一切正常工作.

然而,对于一些用户来说,一些非常奇怪的事情已经开始发生.

authenticateHandler代码被称为,errornil的,但[GKLocalPlayer localPlayer].authenticatedNO,用户没有登录到游戏中心.最重要的是,没有模态游戏中心对话框提示用户登录.应用程序只需启动,authenticateHandler代码被调用,但不会进行身份验证.我认为如果Game Center应用程序允许我使用我的沙箱帐户登录,该应用程序将起作用,但它不会:登录或退出我的生产Game Center帐户,没有沙盒登录选项.

由于这只发生在某些用户身上,而且我的开发设备才刚刚开始发生,我非常怀疑这是我的代码存在的问题,并且我猜测它是iTunes Connect,配置文件,Game Center设置和之间的一些复杂的相互作用.设备上的历史等

我们的应用程序ID和iTunes Connect中启用了游戏中心(两者匹配都有App ID).

救命!

编辑

我的问题可能类似于iOS开发:验证Game Center用户的奇怪问题.针对该问题提出的解决方案是在Game Center应用程序中手动登录.这似乎是一个明智的解决方案,但我需要登录沙箱环境,我找不到在Game Center应用程序中获取沙盒游戏中心登录提示的方法.

cocoa itunesconnect gamekit ios game-center

6
推荐指数
1
解决办法
1021
查看次数

如何使用AWS iOS SDK删除对象?

我正在尝试删除上传到S3存储桶的公共图像(上传图像的cannedACL属性).S3PutObjectRequest[S3CannedACL publicRead]

S3DeleteObjectRequestAWS SDK 文档中有一个类,但似乎没有此类的任何属性或初始化方法.

基于其他语言的示例代码,看起来应该有keybucket属性或初始化方法设置这些属性,就像在iOS SDK的S3PutObjectRequest类中一样,用于将文件上传到存储桶.

这里发生了什么?SDK完全不完整吗?有没有办法用iOS AWS SDK删除对象?

iphone amazon-s3 amazon-web-services ipad ios

5
推荐指数
2
解决办法
2804
查看次数