Вопрос

Как я могу изменить высоту расширения Today моего приложения в Центре уведомлений?

Я попробовал это с помощью конструктора интерфейсов и с помощью кода, конструктор интерфейсов отображает вид с высотой 600, но он не применяет эту высоту к устройству.

Кажется, я не могу увеличить его больше, чем на 80 пикселей...

enter image description here

Это было полезно?

Решение

В вашем виджете UIViewController.m (Цель-C):

self.preferredContentSize = CGSizeMake(0, 200);

Это приведет к тому, что ваш виджет будет иметь высоту 200.

Обратите внимание, что ширина никак не повлияет на вид, так как виджеты должны точно соответствовать ширине центра уведомлений, которая обрабатывается автоматически.

Кроме того, если вы хотите анимировать изменения высоты вашего вида, вы можете реализовать (Objective-C):

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

в вашем представлении контроллер использует -animateAlongsideTransition:completion:

Ответ был немного скрыт;вам пришлось щелкнуть по боковой панели документации, чтобы в конечном итоге найти этот фантастический документ.


Другой способ - использовать ограничения автоматической компоновки чтобы ограничить высоту вашего обзора.

Другие советы

Высота виджетов регулируется системой.Если вы определили свой рост с помощью ограничений, он будет автоматически скорректирован по мере необходимости.Если вы используете явный макет, вы можете запросить новую высоту, изменив preferredContentSize вашего виджета.

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

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

Поскольку высота расширения iOS 10 составляет 110 пикселей.Вы должны использовать новый метод протокола widgetActiveDisplayModeDidChange:withMaximumSize: чтобы увеличить размер расширения (Objective-C):

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
                         withMaximumSize:(CGSize)maxSize {

    if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
        self.preferredContentSize = CGSizeMake(maxSize.width, 600.0);
    } else if (activeDisplayMode == NCWidgetDisplayModeCompact) {
        self.preferredContentSize = maxSize;
    }
}

Также вам, возможно, потребуется позвонить setWidgetLargestAvailableDisplayMode: в контексте вашего расширения в сегодняшнем представлении контроллера viewDidLoad метод, подобный этому (Objective-C):

if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+
    [self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
} else {
    self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10-
}

Эта тема может быть полезна https://forums.developer.apple.com/thread/48930

Лучший способ, конечно, autolayout, но по умолчанию есть поля, которые вы можете контролировать так, как это

func widgetMarginInsetsForProposedMarginInsets
    (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
    return UIEdgeInsetsZero
}
.

Есть два способа отображения сегодня расширение:

  1. Компактный режим (фиксированная высота для виджета)
  2. Развернуть режим (вариабельная высота для виджета)
  3. Какой бы код вы делаете, чтобы изменить высоту расширения в компактном режиме не будет иметь никакого значения.Таким образом, вам необходимо изменить режим от компакта для расширения режима.

    // 1. Load This in viewDidLoad:
    
    override func viewDidLoad() {
      super.viewDidLoad()
      self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
    }
    
    // 2. Implement another widget protocol
    
    func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){
      if (activeDisplayMode == NCWidgetDisplayMode.compact) {
        self.preferredContentSize = maxSize;
      }
      else {
        self.preferredContentSize = CGSize(width: 0, height: 200);
      }
    }
    
    .

    Вы можете означать WWDC для получения дополнительных обновлений о расширении приложений

Сегодня виджет по умолчанию UiedgeInsets DefaultmarginInsets (UiedgeInsets) DefaultMarginInsets= (Top= 0, левый= 44, нижний= 39, справа= 0)

Вы должны добавить этот метод

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
return edgeInsets;}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top