2015-05-19 3 views
51

Расширение My Today должно иметь динамическую высоту, основанную на содержимом, отображаемом виджетами. Я смог добиться этого, добавив ограничение на мой самый нижний элемент: верхняя часть направляющей нижней части меньше или равна нижней нижней части элемента, с константой 0, приоритетом 999, множителем 1.Сегодня Высота расширения для iPad намного больше, чем указано

Это работает точно так, как ожидалось на iPhones - высота виджета соответствует всему контенту плюс нижнее поле по умолчанию применяется до отображения следующего виджета.

Но на iPad кажется, что высота моего виджета равна максимальной высоте. Центр уведомлений позволит виджету быть - у моего виджета много места, это почти полный экран.

Как удалить лишнее пространство?

Я точно знаю, в чем проблема, но я не уверен, как ее решить - см. Раздел «Проблема». Во-первых, позвольте мне объяснить установку:

установки параметров:
Я установил вид этого внутреннего абонента в раскадровке, ничего не делается программно. Представление состоит из 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

Проблема:
от соотношения сторон ограничений на все кнопки в конечном итоге косвенно навязывает «неявный» аспект ra tio на высоте представления виджетов, когда он отправляется systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:, где он передает необходимую ширину (724) для макета с требуемым приоритетом и высотой 0 (для сжатия представления) с приоритетом уровня фитинга. Это приводит к высокому виджету виджетов на iPad, где вид шире для начала. Но нет фактического ограничения соотношения сторон, которое можно удалить. По сути, поскольку я применял ограничения соотношения сторон ко всей кнопке, высота сегодняшнего расширения зависит от его ширины (учитывая все ограничения вместе, соотношение сторон и другое). Таким образом, высота расширения неуклюже в широкой области, проявляющаяся на широком устройстве, таком как iPad. Ограничения на кнопки должны быть пересмотрены или как-то отрегулированы.

Выборка проекта:
sample project that demonstrates the issue доступен из CloudApp, так что вы можете скачать и играть с ним.

Что я пробовал:
Я попытался удалить поля по умолчанию врезки в переопределив widgetMarginInsetsForProposedMarginInsets и возвращение 0 на дно. Это удалило заполнение по умолчанию, поэтому немного уменьшилось, но под ним все еще много свободного места.

UILabel имел ограничение на нем: метка Ведущем равно ведущем SuperView в - постоянная 0, приоритет 1000, множитель 1. Если я просто изменить, что ведущую SuperView в края, дополнительные нижний интервал волшебным образом исчезает. Я задавался вопросом, было ли это потому, что элементы становились слишком большими, поэтому увеличение количества левого интервала уменьшало бы их размер, но я старался, чтобы он был установлен на регулярное лидерство и увеличивал константу, и это не помогло решить проблему. Но это только разрешает проблему для 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

Он не может быть жестко закодирован, он действительно должен быть динамическим по высоте на основе содержимого. Должен работать для всех iPhones и iPads и любого другого будущего размера экрана. – 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

 Смежные вопросы

  • Нет связанных вопросов^_^