2011-05-06 3 views
3

키보드가 표시 될 때 크기를 조절할 수있는 UITableView가 있습니다. 그러나크기가 조정 된 UITableView 셀의 프레임이 업데이트되지 않습니다.

// MonoTouch code 

// Resize the table so it's not hidden by the keyboard 
var keyboardFrame = UIKeyboard.BoundsFromNotification(notification); 
var tableFrame = myTable.Frame; 
tableFrame.Height = theView.Frame.Height - keyboardFrame.Height; 
myTable.Frame = tableFrame; 

// Bring the current cell back in view 
this.InvokeOnMainThread(()=>{ 
    if(currentCell != null) myTable.ScrollRectToVisible(currentCell.Cell.Frame, true); 
}); 

, I (예 UIPopoverController 부착)이 화면에 그 셀의 현재 위치에 민감한 그 셀에 대한 작업을 수행 할 때, I는 해당 셀의 프레임 일본어를 나타내는 것을 알게 테이블 크기 조정 및 스크롤 전 위치

다음과 같이 이전 위치를 가리키는 프레임의 동일한 결과를 얻었습니다 (이 중 상당수는 무엇이 작동하는지 알 수없는 것을 알기 위해 실험하고있었습니다) :

  • 셀에서 SetNeedsLayout을 사용하면 테이블의 하위 뷰인 테이블이 사용됩니다. 셀에 LayoutIfNeeded 사용
  • 테이블의 파단 테이블 테이블을
  • 다중 SetNeedsLayout의 조합
  • 시간 우스운 양 스레드에 자, 새로운 스레드 산란 LayoutIfNeeded 함유보기 다른 레이아웃 기능

을 시간의 말도 안되는 금액을 자고 다음 호출 한 후 새 스레드를 산란 프레임

  • 보고 (무엇이든 다시 그리기/업데이트를/수행 할 수있는 UI를위한 시간을 허용하는) 크기가 맞는지 t인지 확실하지 않습니다. 그가 스크롤하면 고장이 일어나는 곳입니다.

    제스처를 사용하여 표를 스크롤하면 첨부 할 셀과 관련된 올바른 위치에 항상 팝업보기를 표시 할 수 있기 때문에 셀 프레임이 제대로 업데이트 된 것처럼 보입니다. 그래서 테이블 크기를 조정하고 프로그래밍 방식으로 스크롤하면 왜 그렇게되지 않을지 이해할 수 없습니다.

    누구나 ReloadData (ReloadData는이 경우 많은 원치 않는 효과를 일으킴)를하지 않고 셀의 프레임을 업데이트하도록 UITableView를 강제하는 방법을 알고 있습니까?

  • 답변

    2

    이것은 예상 된 동작입니다. UITableView는 UIScrollView에서 상속받습니다. 프레임과 별도로 UIScrollView에는 ContentSize라는 또 다른 속성이 있습니다. 둘은 분리되어 있습니다. 프레임이 부모 뷰와 관련하여 위치와 크기를 나타내는 동안 ContentSize는 스크롤 뷰의 내용 영역을 정의하므로 객체가 매번 스크롤 할 양을 "알 수 있습니다."

    UITableView의 프레임 또는 경계를 변경하거나 해당 뷰에 대한 뷰를 변경해도 반드시 서브 뷰의 프레임이 변경되지는 않습니다. 이 동작은 superview의 ContentMode 속성에 따라 다릅니다.

    어쨌든 표 셀의 프레임은 ContentSize 속성과 관련되어 변경되지 않습니다. 테이블 뷰의 크기를 변경하기 전에 올바르게 작동하기 때문에 그 시점에서 ContentSize와 테이블 뷰의 프레임 만 일치한다고 가정 할 수 있습니다. 테이블 뷰의 크기를 변경하면 ContentSize가 그대로 유지되어 두 값이 일치하지 않게됩니다.

    대신 ConvertRectToView 또는 ConvertRectFromView 메서드를 사용하여 테이블 뷰의 프레임을 기준으로 셀의 사각형을 가져와야합니다.

    관련 문제