2015-05-19 100 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