치수를 변경할 때 하위 뷰의 재정렬 (DrawRect)을 강제로 강제로하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1441760

문제

나는 서브 클래스 행을 포함하는 uiview가 있습니다. UIView. 서브 클래스가 무시되었습니다 drawRect: 그리고 설정되었습니다 contentMode = UIViewContentModeRedraw.

사용자가 부모 컨테이너를 스쿼시하고 스트레칭 할 때 child views 스쿼시와 스트레칭. 모양 변화가 일어나기 때문에 나는 drawRect 내용을 바꾸기 위해 반복적으로 호출됩니다 child views. 지금까지 나는 실패했다. 이것을하는 올바른 방법은 무엇입니까?

건배,

더그

도움이 되었습니까?

해결책

Cocoa에서는 DrawRect 호출이 거의 없다 - 당신은 영역을 표시하거나 업데이트가 필요한 것으로 표시되며, 다시 그리기를 예약 할 예정이다. 이를 통해 여러 개의 무효화가 무너질 수 있도록 다시 그리기를 할 수 있습니다.

코코아 터치의 경우, 당신도 원합니다 SetneedSdisplay보기, 또는 setneedSdisplayInrect : (cgrect)

다른 팁

view setneedSlayout]를 호출해야합니다. 이로 인해 하위 뷰가 DrawRect를 수신해야합니다. 레이아웃이 변경되면 전화하십시오. 그러나 나는 이것을 테스트하지 않았다.

이 솔루션은 약간 미쳤지 만 논리적으로 의미가 있으며 훌륭한 시각적 결과가 있습니다. 나는 함께 일하고있다 NSLayoutManager 그리고 부부 NSTextContainers, 두 열에 텍스트를 놓습니다. 여러 텍스트 컨테이너를 사용하고 있기 때문에 (그리고 여러 개를 원합니다. UITextView), 나는 우선하고있다 draw(rect: CGRect) 의 방법 MyDrawingView: UIView.

문제는 사용하는 것입니다 self.contentMode = .redraw 여전히 회전에 대한 약간의 스트레칭을 초래합니다.

나는 그 설정을 알아 차렸다 contentMode = .left, 또는 contentMode = .scaleAspectFit 픽셀-완벽한 회전 측면에서 내가 원하는 것에 가깝습니다. 그러나 분명히, 나는 내가 필요로하는 추첨 전화를받지 못했습니다.

그래서-나는 무시했다 layoutSubviews(), 스위치 contentMode 에게 .scaleAspectFit, 라고 불리는 super.layoutSubviews(), 그런 다음 다시 전환했습니다. :피

override func layoutSubviews() {
    self.contentMode = .scaleAspectFit

    super.layoutSubviews()
    self.contentMode = .redraw
}

이거 완벽 해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top