2015-08-25 2 views
0

В моем приложении существует потребность в элементе popover, который отображает полное описание.Изменить высоту UIPopoverController, на высоту UITextView

В UIViewController есть нормальный UITextView, который отображает первые 4 строки описания. Теперь, когда пользователь нажимает на это описание, должно отображаться полное описание. Это будет сделано с недавно установленным элементом управления popover для iPhone.

На данный момент все работает, за исключением того факта, что я хочу, чтобы popover имел высоту, которая точно соответствует высоте строки в UITextView в . Таким образом, если описание длиннее, оно автоматически сделает popover выше.

Следующий код вызывается, когда пользователь нажимает UITextView:

func textViewShouldBeginEditing(textView: UITextView) -> Bool { 
    if textView == descriptionTextView { 
     let sb = UIStoryboard(name: "Main-alternative", bundle: nil) 
     let popoverController = sb.instantiateViewControllerWithIdentifier("descriptionControllerID") as! DescriptionPopupViewController 
     popoverController.modalPresentationStyle = UIModalPresentationStyle.Popover 
     popoverController.popoverPresentationController?.delegate = popoverController; 
     popoverController.popoverPresentationController?.sourceView = descriptionTextView 
     popoverController.popoverPresentationController?.sourceRect = descriptionTextView.frame 
     popoverController.descriptionText = currentObject?["description"] as! String 

     if let frameHeight = popoverController.textView?.frame.height { 
      popoverController.preferredContentSize = CGSizeMake(fixedWidth, frameHeight) 
     } 

     self.presentViewController(popoverController, animated: true, completion: nil) 
    } 
    return false 
} 

Так preferredContentSize должен получить высоту вложенной UITextView в DescriptionPopupViewController. Однако, когда я пытаюсь сделать что-то вроде этого он не будет работать:

Я думаю, потому что frameHeight является nil

+0

Но входит или нет в ваш оператор 'if' во время отладки? –

ответ

0

Когда UIViewController создается его вид иерархии не может (и так все подвиды, свойства все еще будет nil), по соображениям оптимизации он не может быть загружен. Чтобы заставить его загрузить иерархию своего представления, вам необходимо установить контроллер view контроллера доступа. Поэтому вам необходимо обновить ваш код следующим образом:

func textViewShouldBeginEditing(textView: UITextView) -> Bool { 

    if textView == descriptionTextView { 
     let sb = UIStoryboard(name: "Main-alternative", bundle: nil) 
     let popoverController = sb.instantiateViewControllerWithIdentifier("descriptionControllerID") as! DescriptionPopupViewController 

     popoverController.modalPresentationStyle = UIModalPresentationStyle.Popover 
     popoverController.popoverPresentationController?.delegate = popoverController; 
     popoverController.popoverPresentationController?.sourceView = descriptionTextView 
     popoverController.popoverPresentationController?.sourceRect = descriptionTextView.frame 

     // forces to load its view hierarchy 
     var view = popoverController.view 
     popoverController.descriptionText = currentObject?["description"] as! String 

     if let frameHeight = popoverController.textView?.frame.height { 
      popoverController.preferredContentSize = CGSizeMake(fixedWidth, frameHeight) 
     } 

     self.presentViewController(popoverController, animated: true, completion: nil) 
    } 

    return false 
} 

Я надеюсь, что это вам поможет.

+0

Привет, Виктор, спасибо за ваше предложение. Я понимаю, что инициализация представления отсутствовала (было уже поздно), и это фиксирует тот факт, что я могу получить высоту представления. Однако проблема с высотой остается, поскольку, по-видимому, 'popoverController.textView? .frame.height' не возвращает правильную высоту. «ViewController» настроен с помощью AutoLayout и имеет только «UITextView» с верхними, левыми, правыми ограничениями, а «прокрутка» отключена. Итак, я ожидал, что представление будет таким же высоким, как 'UITextView', верно? – Hugo

Смежные вопросы