2014-12-27 3 views
14

채팅을하고 있습니다. 모든 것은 꽤 괜찮은 것 같지만 나는 '버그 투성이'문제의 일종으로 부딪 혔다.UITableViewWrapperView 및 UITableView 크기가 자동 레이아웃과 다릅니다

메시지와 UITableView를 입력하기위한 UITextView 막대가있는 UIViewController가 있습니다. 이 제약 조건은 "V:|-(64)-[chatTable][sendMessageBar]-(keyboard)-|"입니다. 키보드가 꺼져 있지 않은 경우 -이 제약 조건의 상수는 0입니다. 그리고 키보드가 꺼진 후에 - 나는 키보드 높이까지 상수를 증가시킵니다.

키보드가 출력되지 않습니다 :

self.table.contentSize = (375.0,78.5) 
self.table.bounds = (0.0,-490.0,375.0,568.5) 
self.table.frame = (0.0,64.0,375.0,568.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) 

와 키보드가 나올 때 나는 일정한 제약을 증가 후

self.table.contentSize = (375.0,78.5) 
self.table.bounds = (0.0,-274.0,375.0,352.5 
self.table.frame = (0.0,64.0,375.0,352.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,-137.5,375.0,137.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,137.5) 

는 그래서 UITableViewWrapperView는, 그 슈퍼 뷰의 크기에 차이가 - jQuery과 . 이 문제를 해결할 수있는 방법이 있습니까? 나는 UITableViewWrapperViewUITableView에 따라 그 프레임과 경계를 바꿀 것이라고 추측 하겠지만 그렇지 않다.

어떤 아이디어가 문제입니까, 아니면 어떻게 해결할 수 있습니까? 좀 더 연구 한 후

를 - viewWillLayoutSubviewsviewDidLayoutSubviews 사이 어딘가에 일 것 같다 :

추가. 그것은 좀 이상한 상점입니다 : 그래서 뭔가 일이 엉망이 보인다

override func viewWillLayoutSubviews() { 
    println("WrapperView Frame :991: \(self.table.subviews[0].frame)") \\ WrapperView Frame :991: (0.0,0.0,375.0,568.5) 
    super.viewWillLayoutSubviews() 
    println("WrapperView Frame :992: \(self.table.subviews[0].frame)") \\ WrapperView Frame :992: (0.0,0.0,375.0,568.5) 
} 

override func viewDidLayoutSubviews() { 
    println("WrapperView Frame :6: \(self.table.subviews[0].frame)") \\ WrapperView Frame :6: (0.0,-137.5,375.0,137.5) 
    super.viewDidLayoutSubviews() 
    println(">> viewDidLayoutSubviews") 
} 

UITableViewWrapperView

답변

7

버그가 (이 버그와 싸우고 나를 위해 모든 일을했다) 것 같다 마지막으로 this 해결 방법은 도움이 :

for (UIView *subview in tableView.subviews) 
{ 
    if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewWrapperView"]) 
    { 
     subview.frame = CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height); 
    } 
} 
+2

사과의 금지 된 API 중 하나가 아닙니까? (UITableViewWrapperView) –

+0

이것은 금지되어 있는지 여부입니다. 나는 그것을 사용해야한다. 하지만 무서워. – anamika41

28

가 나를 위해 그것을 고정 다음 :

func fixTableViewInsets() { 
    let zContentInsets = UIEdgeInsetsZero 
    tableView.contentInset = zContentInsets 
    tableView.scrollIndicatorInsets = zContentInsets 
} 

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    fixTableViewInsets() 
} 

insets가 모두 0 인 viewWillAppear()에서 발견했습니다. 그러나 viewDidAppear()에서 탐색 막대에 대해 오프셋이되도록 수정되었습니다. 이로 인해 UITableViewWrapperView가 UITableView와 다릅니다. 다른 위치에서 호출하는 것이 더 쉽도록 인세 트를 자체 루틴에서 변경했습니다. viewWillLayoutSubviews()는 표시되기 전에 변경됩니다. viewDidAppear()에 변경 사항을 배치하면 테이블이 멍청 해졌습니다.

+0

많은 감사합니다, 그것은 나를 위해 완벽하게 작동합니다 – f1rstsurf

+1

이것은 질문에 대한 정답이어야합니다. 나를 위해 일했다. –

+0

감사합니다. 이로 인해 저에게 문제점이 해결되었습니다. 이 문제의 원인은 무엇입니까? 나는 2 개의 tableviews를 가지고 있고 오직 하나만이 같은 contentview에 표시 되더라도, 이렇게 행동했다. –

4

오늘이 문제가 발생하여 @anorskdev에서 제안한 수정 사항이 제대로 작동하지만 문제의 근본 원인은 automaticallyAdjustsScrollViewInsets UIViewController의 속성 인 것으로 보입니다. 기본값은 true입니다. 나는 스토리 보드에서 그것을 껐다가 문제가 사라졌다. View Controller 속성에서 "Scroll View Insets 조정"체크 상자를 선택하고 체크 표시가 해제되어 있는지 확인하십시오.

+0

_이 답변은 위의 답변이 아니라 올바른 답변이어야합니다 (작동하지만). – SparkyRobinson

관련 문제