天道酬勤,学无止境

自动布局问题:iOS 7 与 iOS8(Auto-Layout Issues: iOS 7 vs iOS8)

问题

我正在尝试创建一个像这样工作的可折叠工具栏(在 iOS 7 中运行 - 出于可视化目的,丑陋的颜色等):

iOS 7 中的工具栏行为

但是,当我在 iOS 8 中运行代码时,会发生以下情况: 在此处输入图片说明 我已经建立了一个基于以下内容的约束系统: 可折叠工具栏图

centering view (未显示)将工具栏保持在屏幕中间。 sizing view以折叠工具栏。 sizing view锚定在centering view的右侧(通过trailing约束)。 container view保存工具栏的实际内容。 它锚定在sizing view的右侧(也通过trailing约束)。 容器content views中包含各种content views container view 。 他们没有任何限制。 系统应用的默认约束应该是宽度、高度、顶部、左侧,以确保它们在container view保持相对位置。

工具栏的折叠实现如下:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50; // adjust this number for collapse / expand
    [UIView animateWithDuration:0.3 animations:^{
        [self.centeringView layoutIfNeeded]; // trigger animation
    }];
}

调整sizing view的宽度。

问题: iOS 8 似乎表现得好像我已经离开锚定内容视图,但事实并非如此。

我真诚地感谢:

  • 解释为什么 iOS 8 会对给定的(相当简单的)约束有如此截然不同的解释。
  • 关于如何在 iOS 8 中获得预期行为的指针

此处提供源代码(适用于 iOS 8 的更新版本)。

更新:该问题已通过 Stack-overflow 的答案解决。 基本上,正确的答案是这个,但在这个答案中很好地总结了它。 iOS7 和 iOS8 之间的区别不在于约束的解释方式,而在于更新命令在视图层次结构中向下传递的方式。 当我首先在 iOS 7 中实现该行为时,我注意到只有在sizing view的父sizing view (即centering view )上调用layoutIfNeeded ,动画才能正常工作。 在 iOS 7 中,这显然会自动向下传递视图层次结构。 在 iOS 8 中,情况并非如此。 您必须手动使约束已使用setNeedsLayout更改的视图无效,然后使用layoutIfNeeded更新布局。 我在更新代码中的解决方案如下所示:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50;
    [self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
    [UIView animateWithDuration:0.3 animations:^{
        [self.sizingView layoutIfNeeded]; // trigger animation
    }];
}

我希望这可以帮助那些也被这个向前兼容性问题所困扰的其他人。

回答1

该问题已通过 Stack-overflow 的答案解决。 基本上,正确的答案是这个,但在这个答案中很好地总结了它。 iOS7 和 iOS8 之间的区别不在于约束的解释方式,而在于更新命令在视图层次结构中向下传递的方式。 当我首先在 iOS 7 中实现该行为时,我注意到只有在sizing view的父sizing view (即centering view )上调用layoutIfNeeded ,动画才能正常工作。 在 iOS 7 中,这显然会自动向下传递视图层次结构。 在 iOS 8 中,情况并非如此:您必须手动使约束已通过setNeedsLayout更改的视图无效,然后使用layoutIfNeeded更新布局。 我在更新代码中的解决方案如下所示:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50;
    [self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
    [UIView animateWithDuration:0.3 animations:^{
        [self.sizingView layoutIfNeeded]; // trigger animation
    }];
}

我已经更新了问题以包含答案,但为了回应@unmircea,我也发布了一个单独的答案。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Auto-Layout Issues: iOS 7 vs iOS8
    I am trying to create a collapsible toolbar that works like this (running in iOS 7 -- ugly colors etc. for visualization purposes): However, when I run the code in iOS 8, this is what happens: I have set up a constraint system that is based on the following: A centering view (not shown) keeps the toolbar in the screen middle. A sizing view is adjusted to collapse the toolbar. The sizing view is anchored to the right of the centering view(via a trailing constraint). A container view holds the actual content of the toolbar. It is anchored to the right of the sizing view (also via a trailing
  • iOS 8上的自动版式出现问题(代码在iOS 7上完美运行)(Issue with Auto Layout on iOS 8 (code works perfectly on iOS 7))
    问题 我有一个使用auto-layout构建的应用程序,当我在iOS 7设备上运行该应用程序时,一切仍然可以按预期运行,但是,当我在iOS 8设备上运行该应用程序时,我的一些约束有些古怪。 实际上,我在另一个应用程序中遇到了类似的问题,但这并不是一个大问题。 现在,我开始怀疑这是iOS 8 SDK中的错误,还是我不知道的iOS8中是否存在处理自动布局的新方法。 这是我的设置:我有一个嵌入了UIImageView的UIView 。 视图和图像视图都具有将其底部,前边缘和后边缘固定到其常量= 0的约束的约束。 UIView的顶部边缘也固定在其superview上,并且我有一个IBOutlet连接到约束以便以编程方式对其进行调整。 UIImageView的第四个约束将其高度固定为设备的高度(在我的情况下为568)。 这是我在iOS 7中期望/实现的行为:我试图缩小容器视图的高度,并导致图像视图的顶部被切掉而没有改变宽高比(看起来像您裁剪的那样)图像顶部关闭)...这就是为什么我固定图像视图的高度和底部边缘的原因。 iOS8中实际发生的情况:容器视图按预期缩小(它固定在侧面和底部,高度缩小)。 UIImageView行为就好像它有一个顶部空间约束,余弦==0。整个图像会缩小,而不是切掉图像的顶部。 由于我将图像置于AspectFit模式下,因此AspectFit捏住侧面以保持纵横比不变
  • iOS8的自动布局问题,其代码在iOS7上可以正常运行(Autolayout problems with iOS8 with code that works fine on iOS7)
    问题 我正在为iPhone和iPad开发应用程序。 它支持iOS6和iOS7,并且专门使用自动布局。 过去一周,当苹果公司宣布iOS8已准备就绪,我将其中一部iPhone和iPad都升级到了iOS8。 我还将XCODE升级到了版本6。我有第二台iPhone,我留在iOS7上。 我用Xcode 6生成了新的可执行文件,我很沮丧地看到,在运行iOS8的设备上执行时,它们的屏幕布局被弄乱了,但在iOS7上仍然很好。 在我的物理设备和Xcode的仿真器上都是如此。 进行了大量的挖掘工作,但是我现在很清楚发生了什么,尽管我不知道为什么。 具体来说,某些自动布局操作对我来说在iOS8上失败了,但在iOS7上很好。 一些示例,其中包含一个按钮,我将其放置在大小等于屏幕大小的基础视图上: (1)如果我要求自动布局将按钮的水平中心(CX)定位为与基础视图的水平中心相等,则结果是按钮的水平中心位于基础视图的左边缘。 (2)如果我要求自动布局使按钮的宽度等于基础视图宽度的50%,则根本没有宽度。 我能够解决这些问题,如下所示: (1)我要求自动布局将按钮的中心定位为等于基础视图的左边缘加上屏幕宽度的50%。 (2)我要求自动布局使按钮的宽度等于屏幕宽度的50%。 我通过类似的变通方法慢慢回到自己的方式,回到适用于iOS7和iOS8的自动布局代码。 但是我真的很想知道这是怎么回事。
  • iOS8-约束模糊地建议高度为零(iOS8 - constraints ambiguously suggest a height of zero)
    问题 有谁知道如何调试吗? 仅警告一次:检测到一种情况,即约束对于表视图单元格的内容视图含糊其词暗示高度为零。 我们考虑的是无意倒塌,而是改用标准高度。 这些行的固定高度由 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 34.0; } 所有的constraints似乎都很高兴... 回答1 强迫返回高度和估计高度使警告在我的情况下消失了。 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } 不需要两个替代的另一种解决方案是简单地使用self.tableView.rowHeight = 44; 在您的loadView或init方法中。 回答2 还可以做的是在内容视图的顶部和底部添加垂直约束。 这将使自动布局开心
  • 来自iOS8的UITableView:rowHeight的值错误(Wrong value from UITableView:rowHeight at iOS8)
    问题 我用来创建矩形的代码(至少到iOS7为止)是 CGRect rect = [cTableView frame]; rect.origin.y += [cTableView rowHeight]; searchOverlayView = [[BecomeFirstResponderControl alloc] initWithFrame:rect]; 在iOS7上, cTableView ( UITableView的实例)返回44 。 使用iPhone 5s在iOS8中进行测试会返回-1 。 为什么会这样呢? 为了使我的应用程序与iOS7向后兼容,需要使用什么正确的代码? 回答1 苹果将​​iOS8中的默认行高更改为UITableViewAutomaticDimension ,它声明为-1 。 这意味着您的表格视图已设置为自动计算像元高度。 您将需要实现autoLayout(推荐)或实现新的委托方法: heightForRowAtIndexPath 。 这是有关自动布局的一个大问题:在UITableView中使用自动布局以获取动态单元格布局和可变的行高 但是,似乎您实际上已经在对44(旧的默认值)进行有效的硬编码,因此您可以这样做(不推荐)。 回答2 这使我挣扎了好几个小时。 我最终将值硬编码为44: self.tableView.rowHeight = 44; 回答3
  • iOS8 中 CGAffineTransform 的动画看起来与 iOS7 不同(Animation of CGAffineTransform in iOS8 looks different than in iOS7)
    问题 我试图找到一个原因,为什么UIView转换属性的动画在 iOS 8 和 iOS 6/7 中看起来不同。 举个简单的例子,在 iOS 8 之前: myView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, 1.57); [UIView animateWithDuration:5 animations:^{ myView.transform = CGAffineTransformTranslate(plane.transform, 100, 0); }]; 给出了预期的结果,“myView”旋转了 90 度并向下移动,但是在 iOS8 中,当翻译动画时,它从我找不到解释的点开始(这打破了动画)。 有谁知道它的解释? 提前致谢! 回答1 CGAffineTransformIdentity 在 ios7 和 ios8 上的表现不同。 这与自动布局和大小类有关。 解决办法是去掉ios7上与动画冲突的约束。 // solve the constraint-animation problem if(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) { // iOS7 remove constraints that conflict
  • iOS8使用Interface Builder自动调整大小的静态TableView单元(iOS8 self-sizing static TableView cells with Interface Builder)
    问题 我对能够在Xcode内使用自动布局支持动态类型来构建我的静态TableView的前景感到兴奋,正如WWDC2014在表和集合视图中的新增功能中所述。 我宁愿使用严格的Xcode / Interface Builder和情节提要来处理自动版式。 当我这样做时,以某种方式TableView单元格不会调整大小,并且我确定我缺少一些简单的东西。 要重现此问题,请使用Xcode 7 beta 5,我: 创建了一个新的单视图项目。 将情节提要入口点设置为新的UITableViewController。 使它成为具有分组样式的静态表格视图。 在第一行添加了一个标签。 在顶部,底部,左侧和右侧添加了约束。 将标签字体设置为“正文”。 已添加到ViewDidLoad: self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0; 对其进行调整,然后在“设置”中调整“动态类型”。 字体更改时,TableView的高度仍然停留在表面上的默认值44处,并截断了标签。 这是上述结果的GitHub存储库。 为什么自动布局不导致TableView扩展以填充必要的空间以适合新的较大标签文本? 我发现了有关该主题的出色文章,例如以下内容,并着重于在此处使用代码设置约束。
  • 仅使用自动布局的iOS8 Today扩展程序的高度会产生约束(Height of iOS8 Today Extension using Only Auto Layout Gives Broken Constraints)
    问题 Apple文档建议使用自动布局来设置Today Extensions的高度。 如果窗口小部件具有要显示的其他内容,则可以依靠“自动布局”约束来适当调整窗口小部件的高度。 如果不使用自动布局,则可以使用UIViewController属性preferredContentSize指定小部件的新高度。 但是,我看到的每个示例和教程最终都使用preferredContentSize 。 我通过自动布局来设置高度的所有尝试都导致警告了约束破损。 通过自动布局设置高度 我从一个新的xcode模板和一个今天的扩展模板开始。 我添加到TodayViewController.m的唯一TodayViewController.m是: - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { return UIEdgeInsetsMake(0, 0, 0, 0); } 注意:如果仅使用默认边距,仍然会出现此问题。 我限制了标签的高度,将标签在容器中居中,并将容器的高度限制为与标签的高度相同: 这将导致标签以指定的高度填充容器,而不会出现约束冲突。 相反,我遇到了约束冲突: 2014-09-28 10:27:39.254 TodayExtension[61090
  • 自动布局不会在 iOS8-Xcode6 中立即更新帧(Autolayout is not updating frames instantly in iOS8-Xcode6)
    问题 我在autolayout中使用autolayout XCode6 。 我已将以下约束应用于scrollview 。 我试图在 iPhone 4Inchs 设备的viewDidLoad和viewWillAppear方法中访问此滚动视图的框架。 这里的问题是,滚动视图的宽度在日志中显示为 600。 但是在 4Ichs 设备中宽度应该是 300,因为我正在使用autolayout 。 似乎自动autolayout将在一段时间后应用。 它在viewDidAppear方法中显示正确的宽度为 300。 有没有办法访问viewDidLoad和viewWillAppear方法中的原始帧? 提前致谢。 回答1 在布局传递发生之前,自动布局不会为您提供“正确”的帧大小。 viewDidLoad为时过早,而且我的头顶willAppear可能也是如此。 viewDidLayoutSubviews是正确的地方。 回答2 将此代码放在您的 viewDidLoad() 中 self.view.setNeedsLayout(); self.view.layoutIfNeeded(); 在访问scorllView.frame.size.width之前 回答3 从 viewDidLoad 和 viewWillAppear 中,它的显示与界面构建器的维度相同。 如果您的应用程序在 scrollView 框架上中继
  • 为 iOS8 创建 Launch Screen.xib(... iOS11、Swift 4 和 LaunchScreen.storyboard)(Creating Launch Screen.xib for iOS8 ( … iOS11, Swift 4 and LaunchScreen.storyboard ))
    问题 我刚刚发现,为了能够在应用程序商店中对您的应用程序进行说明,请说“此应用程序已针对 iPhone 6 和 iPhone 6 Plus 进行了优化”。 您需要为启动图像使用启动 XIB 或故事板文件(根据 [Apple][1])。 所以,我创建了一个新的 Launch Screen xib,现在我有点小,但因为我通常在代码中做所有事情并且不使用界面构建器。 我删除了插入的默认标签并将UIImageView放入视图中。 现在我想知道我将如何: 1)告诉UIImageView调整到它所在的任何屏幕的大小 2) 告诉 UIImageView 如果 3.5 英寸屏幕正在运行应用程序或 ImageB 如果 4 英寸屏幕正在运行应用程序等,则选择 ImageA。 本质上,我只是想让启动 .xib 模仿启动屏幕正常工作的行为。 如果有人可以为此提供一些帮助,将不胜感激! 回答1 您有两个选择: 您使用自动布局并为图像视图提供全屏外观(到顶部、底部、左侧和右侧的距离等于 0)。 然而,这会导致某些屏幕尺寸的图像被剪裁,这是您可能不想要的。 所以你可能要考虑(2) 您将启动屏幕图像放入资产目录,然后将不同的图像放入不同的尺寸类别。 回答2 我发现答案很有用。 简而言之,为 iOS 8创建 LaunchScreen xib的旧步骤位于新步骤下方。 参考XCode 9、Swift 3 或 Swift
  • 如何在 iOS 8 中获取 UICollectionViewCells 的自动布局大小? (systemLayoutSizeFittingSize 在 iOS 8 中返回高度为零的大小)(How can a get the auto layout size of the UICollectionViewCells in iOS 8? (systemLayoutSizeFittingSize returns size with zero height in iOS 8))
    问题 由于 iOS 8 [UIColletionViewCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]返回高度为 0 的大小。 下面是代码的作用: 要确定 iOS 7 中UICollectionView中单元格的大小,我使用systemLayoutSizeFittingSize:在使用自动布局的 xib 文件中定义的单元格上。 大小取决于作为我的 xib 文件中UICollectionViewCell子视图的UILabel的字体大小。 标签的字体设置为UIFontTextStyleBody 。 所以基本上单元格的大小取决于 iOS 7 中的字体大小设置。 这是代码本身: + (CGSize)cellSize { UINib *nib = [UINib nibWithNibName:NSStringFromClass([MyCollectionViewCell class]) bundle:nil]; // Assumption: The XIB file only contains a single root UIView. UIView *rootView = [[nib instantiateWithOwner:nil options:nil] lastObject]; if ([rootView
  • iOS9 App顶部和底部都有黑条(iOS9 App has black bars on top and bottom)
    问题 我的应用程序不使用自动布局,它最初是为iPhone 4 / 4s设计的,自那时以来,UI几乎没有被修改过。 布局相当小,因此尚未优先考虑切换其自动布局。 以前在iOS8平台上构建过,我的应用程序可以在iPhone 5和更高版本的iPhone 5上正常缩放,从而充满了整个屏幕。 视图本身将填满整个屏幕,而图标将按比例缩放(以使它们不失真)。 但是,现在看来,使用iOS9 Beta,该应用程序在顶部和底部都出现黑条,并且基本上将其显示为缩放的iPhone 4应用程序,从而在顶部和底部出现黑条。 基本上,我希望它可以缩放以适合全屏,就像在iOS8中一样。 任何人都可以向造成黑条的变化之处发光一下吗? 我应该补充一点,如果它使用xcode 7(ios9 xcode)构建并使用iOs8部署设备,它可以正常工作,则问题是正在部署到iOS9设备。 该应用程序现在在iOS9上看起来像这样,红色区域是该应用程序现在的可用空间,而以前是整个大小(请注意黑条)。 回答1 @Fantina @Goles我可以通过创建并添加分辨率为640x1136的Default-568h@2x.png文件来临时解决此问题。 然后,我更新了“应用程序图标和启动图像”部分,如下所示: 我认为这不是一个长期解决方案,因为为了与iOS9和分屏应用兼容,苹果需要情节提要或Xib文件。 对于仅依赖程序化视图生成
  • iOS 8动画错误(iOS 8 animation bug)
    问题 我有一个简单的动画视图方法。 -(void)animateSelf { CABasicAnimation * animation; animation = [CABasicAnimation animationWithKeyPath:@"position.y"]; // settings ... [self.view.layer addAnimation:animation forKey:@"position.y"]; animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; // settings ... [self.view.layer addAnimation:animation forKey:@"transform.rotation.z"]; [UIView animateWithDuration: 1.0 animations:^{ CGRect rect = self.view.frame; rect.origin.y += 800; self.view.frame = rect; } completion:nil]; } 对于iOS 7,它运行良好。 但是对于iOS 8动画,其行为表现出乎意料。 有没有办法为iOS 8组合这些动画?
  • iOS8:可以为静态单元格使用“ tableview.rowHeight = UITableViewAutomaticDimension”吗?(iOS8: Possible to use “tableview.rowHeight = UITableViewAutomaticDimension” for static cells?)
    问题 我有一个具有五个静态单元格的UITableView。 我需要一个单元格的高度来自动调整其内容,即一个UILabel。 有什么我可以使用的方法吗? tableView.estimatedRowHeight = 42.0 tableView.rowHeight = UITableViewAutomaticDimension ..对于带有静态单元格的表格视图,还是仅对带有动态原型单元格的表格视图有效? (或者您有其他建议这样做的方法吗?) 附加信息 UITableView位于TableViewController中,该TableViewController嵌入到容器视图中。 五个静态单元格彼此之间有很大不同,并且仅在一个应用程序场景中使用,因此对于动态原型和自定义单元格子类而言,我没有多大意义。 我这样更新tableview -(void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [_myTableView reloadData]; } 我将约束添加到UILabel,如下所述:http://www.appcoda.com/self-sizing-cells/ 回答1 对于iOS 8,我发现您不能执行与动态表视图单元格相同的策略。 为了自动调整静态单元格的高º
  • iOS面试题,性能优化篇!
    1.形成tableView卡顿的缘由有哪些?1.最经常使用的就是cell的重用, 注册重用标识符若是不重用cell时,每当一个cell显示到屏幕上时,就会从新建立一个新的cellhtml若是有不少数据的时候,就会堆积不少cell。ios若是重用cell,为cell建立一个ID,每当须要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,若是没有再从新建立cellc++2.避免cell的从新布局cell的布局填充等操做 比较耗时,通常建立时就布局好面试如能够将cell单独放到一个自定义类,初始化时就布局好swift3.提早计算并缓存cell的属性及内容当咱们建立cell的数据源方法时,编译器并非先建立cell 再定cell的高度xcode而是先根据内容一次肯定每个cell的高度,高度肯定后,再建立要显示的cell,滚动时,每当cell进入凭虚都会计算高度,提早估算高度告诉编译器,编译器知道高度后,紧接着就会建立cell,这时再调用高度的具体计算方法,这样能够方式浪费时间去计算显示之外的cell缓存4.减小cell中控件的数量尽可能使cell得布局大体相同,不一样风格的cell可使用不用的重用标识符,初始化时添加控件,网络不适用的能够先隐藏数据结构5.不要使用ClearColor,无背景色,透明度也不要设置为0渲染耗时比较长多线程6.使用局部更新若是只是更新某组的话
  • 添加披露指标时,ios8单元约束受到破坏(ios8 cell constraints break when adding disclosure indicator)
    问题 我在IOS8上的自动布局有问题,我可以重新创建的最简单的情况是一个简单的tableView。 我设置了一个静态单元格,然后简单地添加了一个标签。 我的目标是使标签在很大程度上占据空间,因此我对标签有三个限制... 在Superview中垂直居中(我认为这很好) 将标签尾随页边距设置为30(相对于超级视图) 将标签前导边距设置为30(相对于超级视图) 一切都很好,并且可以完美运行而不会出现重大问题或警告(它会警告零高度,但是我认为这并不是什么大问题) 现在...如果我添加一个披露指标,那一切都会崩溃。 看起来还可以,但是我得到以下信息: 2014-10-30 15:51:46.358 ContraintIssue[25572:1586028] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or
  • 启动图像未显示在我的iOS应用中(Launch Image does not show up in my iOS App)
    问题 我想使用Xcode 6.0.1构建的应用程序中显示一个简单的启动屏幕。 我以两种方式添加了启动屏幕:作为XIB(默认名称,LaunchScreen.xib)和作为xcassets中的启动图像集。 我已经确保将我的“启动屏幕文件”设置为LaunchScreen.xib。 我已经模拟了所有可用的设备(例如,“ iPhone5 iOS8” /“ iPhone5s iOS8” /“ iPhone6 iOS8”。请注意,模拟器中仅提供iOS 8)。 回答1 因此,对于一些琐碎的事情来说,这一直是很痛苦的。 这是我所做的: 使用xcassets 我决定使用.xcassets与.xib进行启动。 我删除了.xib。 如果您的项目中已经有images.xcassets,那就太好了,否则您可以从File> New> file中添加一个: 创建启动映像集 现在,通过右键单击导航器区域,至少在.xcassets文件中创建启动图像集和图标集。 更新应用程序图标并启动图像设置 然后,确保目标中的“应用程序图标和图像集”如下所示。 非常重要:确保“启动屏幕文件”设置为空白。 添加图像 最后但并非最不重要的一点是,Apple用于设备选择的术语令人困惑。 最初,我认为由于仅针对iOS8(iPhone Portrait)进行部署,因此我可以这样做,只需放入iPhone 6和iPhone 6+的启动映像即可:
  • 应用自动调整大小时,iOS8 MKMapView Framebuffer 在旋转期间出错(iOS8 MKMapView Framebuffer error during rotation when autoresize is applied)
    问题 #import "AppDelegate.h" #import <MapKit/MapKit.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { [self setWindow:[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]]; [self.window makeKeyAndVisible]; UIViewController *vc = [[UIViewController alloc] init]; self.window.rootViewController = vc; vc.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; MKMapView *map = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; map.autoresizingMask
  • Xcode 6中的情节提要中的“限制利润率”是什么(What is “Constrain to margin” in Storyboard in Xcode 6)
    问题 我正在使用自动布局和约束,发现Xcode 6中有一个“ Constrain to margins选项,该选项在Xcode 5中不存在,并且默认情况下已选中。 我创建了一个测试项目,然后在ViewController上添加了一个UITableView ,其框架设置为与视图相同的大小并添加了约束 Xcode 6即使tableview与view Xframe建议添加-16作为约束,而Xcode 5建议添加间距0,您也可以在此处看到。 现在,当您取消选中“约束到边距”选项时,其行为与Xcode 5相同,建议添加0作为约束 另外,我发现,一旦在Constraint中添加了Constrain约束,就无法再在Xcode 5中打开情节提要文件,因此在Xcode 6中绝对是新功能 希望我能够正确解释我的问题。 我想了解“限制利润率”的实际作用,以及何时应该使用和不应该使用它。 如果这很简单明显,我对此表示歉意。 编辑 我在这里的讨论中发现了一些关于布局边距的东西,我想知道这是否与此有关。 回答1 我根本不明白为什么人们会抱怨“保证金会导致iOS 8之前的所有版本完全崩溃”。 在厦门国际银行文件或情节串连图板设置你的约束相对利润率不会使上iOS7您的应用程序崩溃,它不会让你的iOS7设备上的UI差别都不是,只要你不碰UIView.layoutMargins和UIView
  • 我们需要为通用应用程序使用 2 Storyboard 吗?(Do we need to use 2 Storyboard for a Universal app?)
    问题 我有一个适用于 iPhone 和 iPad 的项目。 iPad 需要一个拆分视图控制器。 我们是否创建了两个独立的故事板? 一个用于 iPhone(使用自动布局我们可以支持所有设备)和两个用于 iPad。 我的怀疑是它仅在初始视图中的差异。 内部视图重复。 你将如何处理故事板? 回答1 在 iOS 8 中不再需要两个故事板! 我们可以使用自适应 UI 来为所有不同尺寸的 iPad 和 iPhone 定制相同的故事板。 你可以在这里找到一个很好的教程 http://www.raywenderlich.com/83276/beginning-adaptive-layout-tutorial 你也可以在这里找到苹果在 WWDC 会议上的一个不错的视频,然后搜索“Building Adaptive Apps with UIKit” 基本上,我们可以通过在故事板中为不同尺寸类别定义 UI 元素来处理不同的屏幕尺寸。 我们还可以为不同的尺寸类定义不同的自动布局约束。 这些都是 iOS 8 中可能的大小类(我从 https://medium.com/@getaaron/ios-8-development-tips-for-iphone-6-and-iwatch-1c772554ffe0 获取图像) 回答2 对于 iOS 7 及更早版本,是的,使用两个故事板和两个完全不同的界面,因为