演示后在UIPresentationController中调整呈现视图的帧

时间:2015-04-22 18:07:00

标签: ios cocoa-touch uikit uipresentationcontroller

我正在使用自定义演示控制器来制作与UIAlertView类似的内容。我希望它在键盘显示时向上移动。在UIKeyboardWillShowNotification处理程序中,我抓住新的键盘框架,将其存储在属性中,然后调用:

self.presentedView.frame = [wself frameOfPresentedViewInContainerView];

-frameOfPresentedViewInContainerView的实现中,我考虑了当前的键盘高度。

这很有效,但直接修改self.presentedView的框架感觉有点脏。我尝试使用setNeedsLayoutlayoutIfNeeded的各种排列在容器视图上触发布局,但除了直接设置其框架之外,没有任何原因导致呈现的视图移动。

有没有更好的方法来做到这一点,而不仅仅是自己改变框架?

1 个答案:

答案 0 :(得分:1)

您需要更新所提供VC的my production.ini file [app:main] use = egg:annuaireldap#main pyramid.includes = pyramid_beaker pyramid_jinja2 session.key = annuaireldap session.secret = iuyryoiuiytghvfs-tifrsztft session.cookie_on_exception = true session.type = memory my views.py @view_config(route_name="Menu", renderer='templates/menu.jinja2', request_method='GET') def menu(request): bootstrap_css_url = request.static_url('annuaireldap:static/bootstrap.min.css') bootstrap_js_url = request.static_url('annuaireldap:static/bootstrap.min.js') jquery_js_url = request.static_url('annuaireldap:static/jquery.min.js') custom_css_url = request.static_url('annuaireldap:static/custom_css.css') to_rend = {'bootstrap_css':bootstrap_css_url,'bootstrap_js':bootstrap_js_url,'jquery_js':jquery_js_url,'custom_css':custom_css_url} to_rend.update({'Menu_1':request.route_url('addClientPersonne'), 'Menu_2':request.route_url('addClientEntreprise'), 'Menu_3':request.route_url('SeeAll')}) return to_rend @view_config(route_name='SeeAll', renderer='templates/menu.jinja2', request_method=('GET', 'POST')) def seeall(request): return {} @view_config(route_name='login', renderer='templates/login.jinja2', request_method=('GET', 'POST')) def login(request): bootstrap_css_url = request.static_url('annuaireldap:static/bootstrap.min.css') bootstrap_js_url = request.static_url('annuaireldap:static/bootstrap.min.js') jquery_js_url = request.static_url('annuaireldap:static/jquery.min.js') custom_css_url = request.static_url('annuaireldap:static/custom_css.css') settings = request.registry.settings server_uri = settings['server_uri'] rendered_form = None base_dn_user = settings['base_dn_user'] cl = Credentials().bind(request=request) se_connecter = deform.form.Button(name='se_connecter', title='se connecter') form = deform.form.Form(cl, buttons=(se_connecter,)) url_redirect = request.route_url('login') session = request.session session.save() if authenticated_userid(request): url_redirect = request.route_url("Menu") resp = HTTPFound(location=url_redirect) return request.response.merge_cookies(resp) if request.method == 'POST': if 'se_connecter' in request.POST: try: deserialized = form.validate(request.POST.items()) username = deserialized['username'] password = deserialized['password'] server = Server(server_uri) user_dn = 'uid=%s,%s'%(username, base_dn_user) user_dn = 'cn=admin,dc=splynx,dc=lan' password = '1235789' conn = Connection(server, user=user_dn, password=password) if conn.bind(): session[username] = ['agent'] remember(request, username) url_redirect = request.route_url('Menu') resp = HTTPFound(location=url_redirect) return request.response.merge_cookies(resp) except ValidationFailure as e: rendered_form = e.render() else: rendered_form = form.render() return {'bootstrap_css':bootstrap_css_url, 'bootstrap_js':bootstrap_js_url, 'jquery_js':jquery_js_url, 'rendered_form':rendered_form, 'custom_css':custom_css_url} @view_config(route_name='addClientPersonne', permission='add_client', request_method=('GET', 'POST'), renderer='templates/addPersonne.jinja2') def addClientPersonne(request): bootstrap_css_url = request.static_url('annuaireldap:static/bootstrap.min.css') bootstrap_js_url = request.static_url('annuaireldap:static/bootstrap.min.js') jquery_js_url = request.static_url('annuaireldap:static/jquery.min.js') custom_css_url = request.static_url('annuaireldap:static/custom_css.css') rendered_form = None settings = request.registry.settings cl = ClientPersonne().bind(request=request) ajouter = deform.form.Button(name='Ajouter', title='Ajouter') form = deform.form.Form(cl, buttons=(ajouter,)) request.session.save() if request.method == 'POST': if 'Ajouter' in request.POST: try: server_uri = settings['server_uri'] server = Server(server_uri) deserialized = form.validate(request.POST.items()) nom = deserialized['nom'] prenom = deserialized['prenom'] telephone = deserialized['telephone'] description = deserialized['description'] description = "" if description == colander.null else description creator_dn = settings['creator_dn'] creator_pwd = settings['creator_pwd'] conn = Connection(server, user=creator_dn, password=creator_pwd) base_clients_personnes = settings['base_clients_personnes'] new_user_dn = 'uid=%s,%s'%(get_token(14), base_clients_personnes) if conn.bind(): attributes = {'telephoneNumber':telephone, 'sn':nom, 'cn':prenom} if description: attributes['description'] = description conn.add(new_user_dn, ['person', 'uidObject'], attributes) conn.unbind() url_redirect = request.route_url('Menu') resp = HTTPFound(location=url_redirect) return request.response.merge_cookies(resp) except ValidationFailure as e: rendered_form = e.render() except Exception as e: rendered_form = form.render() else: rendered_form = form.render() return {'bootstrap_css':bootstrap_css_url, 'bootstrap_js':bootstrap_js_url, 'jquery_js':jquery_js_url, 'rendered_form':rendered_form, 'custom_css':custom_css_url} my root factory class CustomResourceFactory(): __acl__ = [ (Allow, 'agent', {'add_client', 'modify_client', 'view_client', 'delete_client'}), DENY_ALL ] def __init__(self, request): print "concombre" pass

演示控制器不知道在演示结束后如何以及何时所呈现的VC的布局会发生变化。它只知道它的大小和执行转换所需的位置。

但是表示控制器有一个很好的委托方法,它继承自preferredContentSizeUIContentContainer

所以你应该做的是:

    显示的VC中的
  1. 执行所有布局更改
  2. 确保在
  3. 之后立即更新显示的VC preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer)
  4. 将通知您的演示控制器
  5. 触发演示控制器的preferredContentSize属性的布局传递