Dynamic height using Auto Layout in Today Extension

烂漫一生 提交于 2019-12-24 08:01:00

问题


EDIT: My "original" problem has been solved, it was restricted to 110 height, by "<NSAutoresizingMaskLayoutConstraint:0x6000000985b0 h=--& v=--& UIView:0x7fc83af0aeb0.height == 110 (active)>", but that was before I read about NCWidgetDisplayMode, .Compact and .Expanded, which apparently was introduced in iOS 10.

Funny thing: Looks like they had the bug when they presented the new feature in iOS 10 (https://developer.apple.com/videos/play/wwdc2016/101/?time=3221)

With that implemented though, I still don't get the correct height adjustment. See relevant code details below, and for the full source code check out: https://github.com/everlof/TodayExtensionSample.

override func viewDidLoad() {
    super.viewDidLoad()
    extensionContext?.widgetLargestAvailableDisplayMode = .expanded
    view.backgroundColor = .red
    lbl.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin vitae tempor nulla, in volutpat lectus. Sed quis orci sit amet velit cursus congue non accumsan turpis. Phasellus quis augue lobortis, pharetra arcu vitae, condimentum nunc. Nam rutrum massa ac feugiat eleifend. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non erat orci. Ut consequat faucibus sapien, et luctus magna posuere tempor."
    lbl.numberOfLines = 0
    lbl.backgroundColor = .blue
    lbl.translatesAutoresizingMaskIntoConstraints = false
}

and widgetActiveDisplayModeDidChange (which returns zero height so that it is using Auto Layout instead):

func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
    if activeDisplayMode == .expanded {
        print("EXPANDED")
        preferredContentSize = CGSize(width: 0.0, height: 0.0)
        setupLabel()
    } else if activeDisplayMode == .compact {
        print("COMPACT")
        preferredContentSize = maxSize
        setupLabel()
    }
}

and setupLabel (which removes it and adds it):

func setupLabel() {
    lbl.removeFromSuperview()
    view.addSubview(lbl)
    lbl.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 18).isActive = true
    lbl.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -18).isActive = true
    lbl.topAnchor.constraint(equalTo: view.topAnchor, constant: 18).isActive = true
    lbl.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -18).isActive = true
    lbl.setContentCompressionResistancePriority(1000, for: .vertical)
}

If the extension is STARTED in .expanded it looks correct:

if 'Show less' is pressed it looks correct:

however, if 'Show more' is pressed, then it wont expand again:


回答1:


This is because when you press "Show More", widgetActiveDisplayModeDidChange method is called with activeDisplayMode as expanded.

According to your code, in expanded mode you are setting the preferredContentSize as:

preferredContentSize = CGSize(width: 0.0, height: 0.0)

So, it takes the minimum height allowed for widget, i.e. 110.

Try this:

func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize)
{
    if activeDisplayMode == .expanded
    {
        let size = self.sampleLabel.systemLayoutSizeFitting(self.sampleLabel.bounds.size)
        preferredContentSize = CGSize(width: 0.0, height: size.height)
    }
    else
    {
        preferredContentSize = maxSize
    }
}


来源:https://stackoverflow.com/questions/41524154/dynamic-height-using-auto-layout-in-today-extension

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!