View from bottom


#1

Добрый день!

Подскажите пожалуйста, как вы обычно реализовываете поднимающиеся view с низа!? как мет рассвет высоты?, можно ли сделать это с помощью констрейнтов, или необходимо высчитывать Frame?! Может статьи какие подкинете?!

У меня сейчас делается view дженерик (show, hide), которая принимает контент вью, высота контента высчитывается по Фрейду, вот можно ли заменить?!

В общем если у кого есть на хорошая практика, либо ссылки, поделитесь пожалуйста)))


#2

https://www.swiftkickmobile.com/building-better-app-animations-swift-uiviewpropertyanimator/


#3

Эт не совсем то, что имел ввиду)


#4

покажите пример, который вы хотите или опишите более подробно, с деталями


#5
protocol CompletitionType {
    
    associatedtype CompletitionType
    var completition: ((CompletitionType) -> ())? { get set }
}

protocol LiftingRepresentable {
    
    var heightDidChanged: (() -> ())?   { get set }
    var estimatedHeight: CGFloat        { get }
    var complete: (() -> ())?           { get set }
}

protocol LiftingViewType: class {

associatedtype T

var view: T  { get set }

func show()
func hide()
}

class LiftingView<T: UIView>: UIView, LiftingViewType where T: LiftingRepresentable  {

}

view создается в рантайме,

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

Сейчас у меня все завязано на создании фрейма по рассчитанной высоте, где Y это высотка скрина, и скорее всего нельзя, так нельзя будет сделать, работая с фреймом, но может можно переопределить на констрейнты, имею ввиду что верхушка liftingView это bottom экрана))

Сложно обьяснить человеческим языком


#6

если я правильно вас понял, вам нужно что-то такое

view.translatesAutoresizingMaskIntoConstraints = false
let constraints = [
        NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 8.0),
        NSLayoutConstraint(item: view, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 8.0),
        NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 8.0),
        NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 8.0)]

NSLayoutConstraint.activate(constraints)

#7

Нет))

Смотрите, знаете ведь в приложениях, например dodopizza, нажав на промоакцию, снизу поднимается view, у меня подобные view создаются во время работы приложения.

Вся логика обработки касаний вынесена в LiftingView, также внутрь него я помещаю контент вью, (информация из акции), вот вопрос сводится к следующему, как предварительно можно рассчитать высоту, чтобы поднять view на точную высоту.

вью с контентом по констрейнтам выставлен внутри liftView)) Собственно что вы написали как я понял.


#8

Наверно этот вью должен быть в новом вью контроллере, а высоту расчитывать в UIPresentationController.


#9

Примерно что-то такое сделал, долго откладывал всю тему, так еще немного плаваю в кастомных переходах
@haymob а можно как-то изменять frame vc что сейчас present?!


#10

#11

Даа, я уже написал кастовую презентацию))

у меня в frameOfPresentedViewInContainerView есть ограничение по высоте, и все контроллеры которые презентуются попадают под протокол
protocol WithContentSizeType {

var contentHeight: CGFloat { get }
}

и в UIPresentationController есть view c хидером (contentWrapperView) (верхняя плашка), которая содержит в себе presentedView, и соответственно переопределении метод

override var presentedView: UIView? {

get { return self .contentWrapperView }

}

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


#12

Может так:


#13

Боже)) Это так просто))
Спасибо большое!!!)))