Сегодня высота расширения для iPad намного больше, чем указано

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

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

Но на 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, расположенная под одной полноразмерной этикеткой.
  • Каждая кнопка должна быть одинаковой ширины и высоты - все в квадрате.
  • Нет лишнего места под последним рядом кнопок

Результат:
введите описание изображения здесь

Ожидаемый результат:
введите описание изображения здесь

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

Образец проекта:
образец проекта , демонстрирующий выпуск доступен в CloudApp, так что вы можете скачать его и поиграть с ним.

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

У UILabel было ограничение: ведущий интервал метки равен ведущему интервалу супервизора - константа 0, приоритет 1000, множитель 1. Если я просто изменю его на ведущее поле супервизора, лишний нижний интервал волшебным образом исчезнет. Мне было интересно, было ли это из-за того, что элементы становились слишком большими, поэтому увеличение количества левого интервала уменьшило бы их размер, но я попытался оставить его на обычном интерлиньяже и увеличить константу, и это не решило проблему. Но это решает проблему только для iPad в портретной ориентации. И он даже не решает его полностью, каждый раз, когда вы опускаете Центр уведомлений, он начинается с большой высоты, а затем сжимается до нужного размера. В альбомной ориентации он никогда не сжимается до нужного размера.

Попытки решения:

  • @Lefter предлагает жесткое кодирование размера, которое в этом случае не сработает, поскольку высота является динамической, а виджет доступен для многих размеров / ориентаций экрана.
  • @Yuyutsu попытался решить эту проблему, но, к сожалению, он не соответствует требованиям и демонстрирует противоречивые ограничения и измененный макет.

person Jordan H    schedule 19.05.2015    source источник
comment
Несколько дней назад у меня возникли странные проблемы с высотой сегодняшнего расширения, прочтите эту информацию: stackoverflow.com/questions/26087907/   -  person liushuaikobe    schedule 19.05.2015
comment
попробуйте сделать представление расширения как подпредставление другого настраиваемого контроллера представления, а затем примените в нем viewDidLoad (), он должен работать   -  person Harsh Thakur    schedule 11.08.2015


Ответы (3)


введите здесь описание изображения

Вот как этого добиться:

  1. Вы должны учитывать свое ограничение.

  2. Вставки полей по умолчанию для ваших виджетов не настроены должным образом так, как вы этого хотели, поэтому установка этого параметра по своему усмотрению - единственный обходной путь здесь путем вызова 'widgetMarginInsetsForProposedMarginInsets:'

// Обновляем вставки виджетов

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {

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

Ссылка на измененный образец файла: измененный файл

person NFerocious    schedule 18.08.2015
comment
Кнопки должны быть идеальными квадратами. - person Jordan H; 06.09.2015

Я столкнулся с той же проблемой. Вы добавили ограничение нижнего отступа, как показано на изображении? введите здесь описание изображения

Это сработало для меня. Надеюсь, это поможет

person iOS_Dev    schedule 12.08.2015

Мне пришлось жестко запрограммировать значение виджета в методе делегата viewDidLoad, чтобы исправить это:

import UIKit
import NotificationCenter

class TodayViewController: UIViewController, NCWidgetProviding {

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

}
person Lefteris    schedule 19.05.2015
comment
Его нельзя жестко запрограммировать, он действительно должен быть динамичным по высоте в зависимости от содержимого. Должен работать для всех iPhone и iPad и любого другого размера экрана в будущем. - person Jordan H; 19.05.2015
comment
Жесткое кодирование высоты почти наверняка не сработает в некоторых ситуациях - например, в ландшафтном режиме. Попробуйте следующее: запустите Mobile Safari, переключитесь в альбомный режим и откройте центр уведомлений. - person Tom Harrington; 19.05.2015