小编Joh*_*art的帖子

如何在iOS 7中以编程方式设置设备方向?

我正在使用AutoLayout在iPad应用程序上工作,如果用户启用某种模式("抬头"模式),我想只支持纵向(或纵向颠倒)方向,此外,如果设备在风景,我想自动切换到纵向模式.

在顶视图控制器中,我有以下内容:

- (NSUInteger) supportedInterfaceOrientations {
    if (self.modeHeadsUp) {
        return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
    } else {
        return UIInterfaceOrientationMaskAll;
    }
}

- (BOOL) shouldAutorotate {
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

基于我在其他地方看到的答案,答案似乎是我应该使用"application setStatusBarOrientation".因此,在用户选择"抬头"模式的方法中,我包括:

    UIApplication *application = [UIApplication sharedApplication];
    [application setStatusBarOrientation:UIInterfaceOrientationPortrait
                                animated:YES];
Run Code Online (Sandbox Code Playgroud)

但是,这根本就没有做任何事情.虽然我可以物理移动设备以使其旋转为纵向,但它不会自动移动.

实际上,在运行上面的代码后尝试以横向模式尝试以编程方式设置方向时,当我使用以下代码查询应用程序"statusBarOrientation"时,它对于横向保持为"4":

UIApplication *application = [UIApplication sharedApplication];
int orientation = [application statusBarOrientation];
self.movesTextView.text = [NSString stringWithFormat:@"ORIENTATION %d", orientation];
Run Code Online (Sandbox Code Playgroud)

好像autolayout可能没有被setStatusBarOrientation触发,所以我试图在之后添加这个代码,没有效果:

    [super updateViewConstraints];
    [self.view updateConstraints];
Run Code Online (Sandbox Code Playgroud)

我意识到Apple希望将设备方向放在用户手中.但是,我希望能够在不进行"抬头"模式时支持横向模式.

我错过了能够强制改变方向的东西吗?

xcode autorotate ios autolayout ios7

71
推荐指数
4
解决办法
10万
查看次数

如何获得GameKit回合制比赛的通知?

我正在使用新的回合制iOS5 API开发基于回合制的iOS游戏.

您需要为此实现的委托协议之一是GKTurnBasedEventHandlerDelegate.实现的方法之一是handleTurnEventForMatch.这是来自Apple文档的这种方法:

handleTurnEventForMatch

当本地玩家轮到一个回合制比赛时,发送给代表.

- (void)handleTurnEventForMatch:(GKTurnBasedMatch *)match
Run Code Online (Sandbox Code Playgroud)

参数

match - 包含匹配当前状态的匹配对象.

讨论

当您的代表收到此消息时,玩家已接受正在进行的匹配的推送通知.您的游戏应该结束它正在执行的任何任务,并切换到匹配对象提供的匹配信息.

我的大部分游戏都在运作.我收到通过上述方法收到的动作的通知.我也看到应用程序图标上的徽章正在成功更新.

但是,当转弯事件进来时,我没有收到任何其他系统通知; 通知中心没有显示任何内容等.我是否需要在GameKit之外做一些事情才能启用此功能?当我获得handleTurnEventForMatch时,是否需要手动发送本地通知?文档似乎意味着没有,因为它上面说"当你的代表收到这条消息时,玩家已经接受了正在进行的比赛的推送通知."

所以这似乎意味着玩家点击推送通知来调用此方法(但当然它们从未出现,所以我没有!)

如何在我的应用中启用基于回合制事件的推送通知,我需要做什么?当我收到上述方法时,我是否需要实际发送本地通知(考虑到上述文档的措辞,这似乎与意图相矛盾).

iphone cocoa-touch objective-c gamekit ipad

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

iOS8使用Interface Builder自行调整静态TableView单元格

我很高兴能够在Xcode中构建我的静态TableView,使用自动布局来支持动态类型,如WWDC2014中提到的表和集合视图中的新功能.

我更喜欢严格使用Xcode/Interface Builder和故事板来处理自动布局.当我这样做时,不知何故TableView单元格没有调整大小,我确信我错过了一些简单的东西.

为了重现这一点,使用Xcode 7 beta 5,我:

  • 创建了一个新的单一视图项目.
  • 将Storyboard入口点设置为新的UITableViewController.
  • 使其成为具有分组样式的静态表视图.
  • 在第一行添加了一个标签.为顶部,底部,左侧和右侧添加了约束.
  • 将标签字体设置为"正文".
  • 添加到ViewDidLoad:

    self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0;

  • 在设置中调整并调整动态类型.字体更改时,TableView高度仍然停留在明显的默认值44并截断标签.

模拟器中的截断标签

这是一个GitHub存储库,它是上面的结果.

为什么Auto Layout不会导致TableView扩展以填充必要的空间以适应新的更大标签文本?

我已经找到了关于这个主题的好帖子,如下所示,并且在这里一直在使用代码来设置约束.

我没有找到任何在纯Interface Builder中执行此操作的示例.当然这很有可能吗?

更新

我已经更新了GitHub源代码,以包含一个带有ImageView而不是UILabel的第二个表行; 它显示了同样的问题:

更新截图

此外,当我在标签或图像视图上设置显式高度约束时,我生成以下内容.问题似乎是我没有设置的"UIView-Encapsulated-Layout-Height"约束.我猜它是生成的,因为在我的IB静态表视图中,行高被设置为(默认)为44.

Unable to simultaneously satisfy constraints.
...

"<NSLayoutConstraint:0x7fa371f39e30 V:[UILabel:0x7fa371f38d30'Label'(20)]>",
"<NSLayoutConstraint:0x7fa371c39160 UILabel:0x7fa371f38d30'Label'.top == UITableViewCellContentView:0x7fa371e17dc0.topMargin>",
"<NSLayoutConstraint:0x7fa371c393c0 UITableViewCellContentView:0x7fa371e17dc0.bottomMargin == UILabel:0x7fa371f38d30'Label'.bottom>",
"<NSLayoutConstraint:0x7fa371f41a40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fa371e17dc0(43.5)]>"
Run Code Online (Sandbox Code Playgroud)

但是ViewDidLoad中的这个不应该超越这个吗?

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
Run Code Online (Sandbox Code Playgroud)

自行调整表格视图单元格是否不适用于静态表格视图?

更新2

我使用动态原型而不是静态表视图构建了相同的东西,一切正常:

在此输入图像描述

它确实似乎是静态的与动态原型表.静态表视图单元格未正确展开.

我在WWDC视频中没有看到动态与静态的关系,所以在这一点上我将这个问题搞砸了.如果我学到新东西,我会更新.

我已经更新了上面的GitHub存储库,以显示静态(损坏)和动态(工作)表视图的示例.

xcode uitableview ios autolayout ios8

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

UIStackView 在旋转时隐藏视图和不满意的布局

我有一个视图控制器,我想在其中隐藏某些子视图、标签等,具体取决于特征集合是什么。例如,我在水平压缩时想要隐藏的侧面有标签,在垂直压缩时我想隐藏顶部和底部的标签。

因为我想隐藏界面的整个部分,所以听起来像 UIStackView 会让这更容易。同样,我正在尝试在 Interface Builder / Xcode (9.1 9B55) 中而不是在代码中尽可能多地做,以尽量保持简单。

设计的主要元素是棋盘,它:

  • 长宽比始终为 1:1
  • 在视图中尽可能大

然后我想根据当前的特征集合移动和隐藏它周围的标签和其他项目。

我首先构建了一个水平堆栈视图,对齐方式和分布设置为“填充”。其中有两个项目,boardView(紫色)和 labelView(黄色)。

labelView 中有几个标签,在视图本身中为这些标签的布局设置了约束。

boardView 具有纵横比 1:1 (@1000) 的约束:

在此处输入图片说明

我为 Stack View 设置了以下约束,将其固定到超级视图(底部除外):

  • Safe Area.trailing = Stack View.trailing(@1000)
  • 安全区域.领先 = 堆栈视图.领先 (@1000)
  • Safe Area.top = Stack View.top(@1000)
  • Safe Area.bottom >= Stack View.bottom(@1000)

我设置了这些约束以确保 boardView 永远不会溢出超级视图:

  • boardView.width <= 安全区域.width (@1000)
  • boardView.height <= Safe Area.height (@1000)

然后我将这些约束设置为较低的优先级,以便在可能的情况下,宽度或高度将扩展以填充超级视图(但不会溢出,因为这些优先级低于上述优先级):

  • boardView.width = 安全区域.width (@250)
  • boardView.height = 安全区域.height (@250)

这一切似乎都很好。Xcode 中没有错误,应用程序的行为与我预期的一样,无论是纵向还是横向(这些屏幕截图来自 iPhone 8 模拟器):

在此处输入图片说明 在此处输入图片说明

当我试图隐藏正确的视图时,问题就来了。当我们垂直处于常规模式时,我试图通过隐藏 nameView 来做到这一点。我选择 nameView,单击 Installed 复选框旁边的 …

xcode interface-builder uistackview

4
推荐指数
1
解决办法
1250
查看次数