2015-05-19 38 views
51

我的今日扩展需要基于小部件显示的内容具有动态高度。我能够通过在最底部的元素上添加一个约束来实现这一点:底部布局指南的顶部小于或等于底部最底部元素的底部,常数为0,优先级为999,乘数为1.今天iPad的扩展高度远远大于指定的

这个在iPhone上完全按照预期工作 - 小部件高度适合所有内容,并在显示下一个小部件之前应用默认的底部边距。

但在iPad上,它似乎将我的小部件的高度设置为等于最大高度Notification Center将允许小部件成为 - 我的小部件下方有很多空间,它几乎是全屏。

如何删除多余的空间?

我确切地知道问题是什么,但不知道如何解决它 - 请参阅“问题”一节。首先让我解释一下设置:

的设置:
我在故事板设置这个延长的观点了,什么都不做编程。该视图由5个垂直堆叠的元素组成,其他一些水平堆叠。这些是使垂直线从顶部到底部的自动布局限制 - ,其中没有说明的优先级为1000,乘法器1:

UILabel: height = 35, top space to top layout guide with constant of 10 
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8 
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999 

的必要的行为:

  • 我需要的网格位于单个全宽标签下方的4x4按钮
  • 每个按钮的宽度和高度应完全相同 - 所有完美方块
  • 最后一个r下面没有额外空间流按钮

结果:
enter image description here

预期的结果:
enter image description here

问题:
上的所有按钮的纵横比限制最终间接强加一个'隐式'方面tio约束在窗口小部件视图发送时的高度为systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:,其中它以合适的优先级在必需的优先级和0的高度(压缩视图)时传递必要的布局宽度(724)。这会导致iPad上的高窗口小部件视图在视图更宽的情况下开始。但是没有实际的纵横比约束可以被删除。基本上,因为我已经将纵横比约束应用于所有按钮,所以今天延伸的高度取决于其宽度(考虑所有的约束,纵横比等)。因此,扩展的高度在广泛的领域是不明智的,体现在像iPad这样的宽泛设备上。需要重新考虑按钮的约束,或者以某种方式进行调整。

示例项目:
一个sample project that demonstrates the issue可从CloudApp这样你就可以下载并使用它。

我已经试过:
我试图通过覆盖widgetMarginInsetsForProposedMarginInsets和底部返回0删除默认的保证金插图。这确实删除了默认的填充,因此降低了一点高度,但它下面还有很多额外的空间。

UILabel对其有约束:标签领先等于上海华领先 - 恒为0,优先级1000,乘数1。如果我只是更改为上海华领先保证金,额外的底部神奇间距消失。我想知道是不是因为这些元素变得太大了,所以增加左边距的数量会减小它们的大小,但是我试着将它保持在正常的领先水平,并且增加了常数,但这并没有解决问题。但这只能解决iPad上的问题。它甚至没有完全解决它,每次你下拉通知中心时,它都会从较大的高度开始,然后缩小到适当的大小。在风景中,它永远不会收缩到适当的尺寸。

尝试的解决方案:

  • @Lefteris提出的硬编码的大小,这将不会在这种情况下,作为 高度的工作是动态的,小部件可用于多种屏幕尺寸 /方向。
  • @Yuyutsu试图解决它,但不幸的是,它不符合要求,并显示冲突的约束和修改后的布局。
+0

我得到了一些奇怪的问题今天延长的高度前几天阅读本FYI:http://stackoverflow.com/questions/26087907/height-of-ios8-today-extension-using-only-auto-layout-gives-broken-constraints – liushuaikobe

+0

尝试使扩展视图作为其他自定义视图控制器的子视图,然后在其中应用viewDidLoad(),它应该工作 –

回答

-1

我不得不硬编码,以解决这一问题的viewDidLoad委托方法控件的值:

import UIKit 
import NotificationCenter 

class TodayViewController: UIViewController, NCWidgetProviding { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.preferredContentSize = CGSize(width: 0, height: 320) 
    } 

} 
+1

它不能被硬编码,它确实需要基于内容在高度上动态变化。必须适用于所有iPhone和iPad以及任何其他未来屏幕尺寸。 – Joey

+0

在某些情况下,硬编码高度几乎肯定会失败 - 例如,在横向模式下。试试这个:运行Mobile Safari,切换到横向模式,然后打开通知中心。 –

0

我面临同样的问题。你是否添加了如图中所示的底部填充约束? enter image description here

,对于me.Hope工作有助于

2

enter image description here

下面介绍如何实现这一点:

  1. 你应该考虑你的约束。

  2. 你的小部件默认保证金插图不正确你期望的方式配置,所以在你自己的设置,这是唯一的解决办法在这里通过调用“widgetMarginInsetsForProposedMarginInsets:”

//更新部件插图

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 

    println(NSStringFromUIEdgeInsets(defaultMarginInsets)) 
    return UIEdgeInsetsMake(20, 20, 10, 20) 
} 

修改样本文件链接: Modified file

+0

按钮需要是完美的正方形 – Joey