2015-11-29 5 views
0

Я создаю приложение для калькулятора iOS, в котором есть метка истории, которая показывает все предыдущие вычисления, которые отображаются на одной строке (например, 30 * 10 = 300 4 * 300 = 1200). Я помещал ярлык в UIScrollView, так что, когда ярлык становится шире экрана, я могу горизонтально прокручивать историю. Я позиционировал ярлык, чтобы соответствовать горизонтально и вертикально внутри scrollview, и ограничил ярлык на scrollview в моей раскадровке.Почему я не получаю фактическое содержимое в UIScrollView?

На мой взгляд, контроллер после добавления вычисления в историю, я проверяю свойство canVerticallyScroll, которое указывает, что я добавил в UIScrollView через расширение. Это возвращает true, если ширина содержимого ScrollView шире экрана. Если это так, я хочу, чтобы он прокручивался до конца, используя setContentsOffset.

Вот код, на мой взгляд контроллера:

func saveResultTohistory(var operands: Array<Double>) { 
     if operands.count == 2 { // Unary operation 
      historyLabel.text = historyLabel.text! + operation + "\(operands.removeFirst()) = \(displayValue) " 
     } else if operands.count == 3 { // Binary operation 
      historyLabel.text = historyLabel.text! + "\(operands.removeFirst()) " + operation + " \(operands.removeFirst()) = \(displayValue) " 
     } 
     updateScrollView() // Update the position in the historyScroller 
    } 

    func updateScrollView() { 
     if historyScroller.canVerticallyScroll { 
      let end = CGPointMake(historyScroller.frame.size.width, 0) 
      historyScroller.setContentOffset(end, animated: true) 
     } 
    } 

А вот продолжение:

extension UIScrollView { 
    var canVerticallyScroll: Bool { 
     get { 
      let widthOfScrollView = self.frame.size.width 
      let widthOfContent = self.contentSize.width 
      return widthOfContent > widthOfScrollView 
     } 
    } 
} 

Это работает, но это не точно, потому что, когда первый расчет добавляется к метке, contentSize ScrollView равен (0.0), чего не может быть, потому что в нем есть текст, и пусть его можно назвать (50, 0). после того, как я добавлю еще одно вычисление на метку обновления contentSize (50, 0), но знаю, что метка шире, чем это, потому что теперь она содержит два вычисления.

Так что в основном все работает, за исключением того, что когда я пытаюсь прочитать contentSize, я не получаю точного значения. Почему я не получаю фактический контент в UIScrollView?

ответ

0

ScrollView's contentSize обновляется циклом запуска после запуска вашего кода.

Вы меняете текст этикетки historyText, но не сразу обновляете его размер. Поскольку его размер еще не изменился, размер его контейнера не изменится при его доступе.

+0

спасибо. После того, как вы застряли, ваше объяснение помогло мне решить эту проблему. Для людей, которые сталкиваются с тем же, что и я, так я и решил: я подклассифицировал ** UIScrollView ** и внутри - ** layoutSubviews ** Я поставил логику, чтобы проверить, изменилась ли ширина содержимого и если содержимое больше затем экран. Если оба истины, я прокручиваю до конца scrollView, вызывая ** scrollRectToVisible() **. –

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