我正在使用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希望将设备方向放在用户手中.但是,我希望能够在不进行"抬头"模式时支持横向模式.
我错过了能够强制改变方向的东西吗?
我正在使用新的回合制iOS5 API开发基于回合制的iOS游戏.
您需要为此实现的委托协议之一是GKTurnBasedEventHandlerDelegate.实现的方法之一是handleTurnEventForMatch.这是来自Apple文档的这种方法:
handleTurnEventForMatch
当本地玩家轮到一个回合制比赛时,发送给代表.
- (void)handleTurnEventForMatch:(GKTurnBasedMatch *)match
Run Code Online (Sandbox Code Playgroud)
参数
match - 包含匹配当前状态的匹配对象.
讨论
当您的代表收到此消息时,玩家已接受正在进行的匹配的推送通知.您的游戏应该结束它正在执行的任何任务,并切换到匹配对象提供的匹配信息.
我的大部分游戏都在运作.我收到通过上述方法收到的动作的通知.我也看到应用程序图标上的徽章正在成功更新.
但是,当转弯事件进来时,我没有收到任何其他系统通知; 通知中心没有显示任何内容等.我是否需要在GameKit之外做一些事情才能启用此功能?当我获得handleTurnEventForMatch时,是否需要手动发送本地通知?文档似乎意味着没有,因为它上面说"当你的代表收到这条消息时,玩家已经接受了正在进行的比赛的推送通知."
所以这似乎意味着玩家点击推送通知来调用此方法(但当然它们从未出现,所以我没有!)
如何在我的应用中启用基于回合制事件的推送通知,我需要做什么?当我收到上述方法时,我是否需要实际发送本地通知(考虑到上述文档的措辞,这似乎与意图相矛盾).
我很高兴能够在Xcode中构建我的静态TableView,使用自动布局来支持动态类型,如WWDC2014中提到的表和集合视图中的新功能.
我更喜欢严格使用Xcode/Interface Builder和故事板来处理自动布局.当我这样做时,不知何故TableView单元格没有调整大小,我确信我错过了一些简单的东西.
为了重现这一点,使用Xcode 7 beta 5,我:
添加到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存储库,以显示静态(损坏)和动态(工作)表视图的示例.
我有一个视图控制器,我想在其中隐藏某些子视图、标签等,具体取决于特征集合是什么。例如,我在水平压缩时想要隐藏的侧面有标签,在垂直压缩时我想隐藏顶部和底部的标签。
因为我想隐藏界面的整个部分,所以听起来像 UIStackView 会让这更容易。同样,我正在尝试在 Interface Builder / Xcode (9.1 9B55) 中而不是在代码中尽可能多地做,以尽量保持简单。
设计的主要元素是棋盘,它:
然后我想根据当前的特征集合移动和隐藏它周围的标签和其他项目。
我首先构建了一个水平堆栈视图,对齐方式和分布设置为“填充”。其中有两个项目,boardView(紫色)和 labelView(黄色)。
labelView 中有几个标签,在视图本身中为这些标签的布局设置了约束。
boardView 具有纵横比 1:1 (@1000) 的约束:
我为 Stack View 设置了以下约束,将其固定到超级视图(底部除外):
我设置了这些约束以确保 boardView 永远不会溢出超级视图:
然后我将这些约束设置为较低的优先级,以便在可能的情况下,宽度或高度将扩展以填充超级视图(但不会溢出,因为这些优先级低于上述优先级):
这一切似乎都很好。Xcode 中没有错误,应用程序的行为与我预期的一样,无论是纵向还是横向(这些屏幕截图来自 iPhone 8 模拟器):
当我试图隐藏正确的视图时,问题就来了。当我们垂直处于常规模式时,我试图通过隐藏 nameView 来做到这一点。我选择 nameView,单击 Installed 复选框旁边的 …
xcode ×3
autolayout ×2
ios ×2
autorotate ×1
cocoa-touch ×1
gamekit ×1
ios7 ×1
ios8 ×1
ipad ×1
iphone ×1
objective-c ×1
uistackview ×1
uitableview ×1