치수를 변경할 때 하위 뷰의 재정렬 (DrawRect)을 강제로 강제로하려면 어떻게해야합니까?
-
10-07-2019 - |
문제
나는 서브 클래스 행을 포함하는 uiview가 있습니다. UIView
. 서브 클래스가 무시되었습니다 drawRect
: 그리고 설정되었습니다 contentMode = UIViewContentModeRedraw
.
사용자가 부모 컨테이너를 스쿼시하고 스트레칭 할 때 child views
스쿼시와 스트레칭. 모양 변화가 일어나기 때문에 나는 drawRect
내용을 바꾸기 위해 반복적으로 호출됩니다 child views
. 지금까지 나는 실패했다. 이것을하는 올바른 방법은 무엇입니까?
건배,
더그
해결책
Cocoa에서는 DrawRect 호출이 거의 없다 - 당신은 영역을 표시하거나 업데이트가 필요한 것으로 표시되며, 다시 그리기를 예약 할 예정이다. 이를 통해 여러 개의 무효화가 무너질 수 있도록 다시 그리기를 할 수 있습니다.
코코아 터치의 경우, 당신도 원합니다 SetneedSdisplay보기, 또는 setneedSdisplayInrect : (cgrect)
다른 팁
view setneedSlayout]를 호출해야합니다. 이로 인해 하위 뷰가 DrawRect를 수신해야합니다. 레이아웃이 변경되면 전화하십시오. 그러나 나는 이것을 테스트하지 않았다.
이 솔루션은 약간 미쳤지 만 논리적으로 의미가 있으며 훌륭한 시각적 결과가 있습니다. 나는 함께 일하고있다 NSLayoutManager
그리고 부부 NSTextContainer
s, 두 열에 텍스트를 놓습니다. 여러 텍스트 컨테이너를 사용하고 있기 때문에 (그리고 여러 개를 원합니다. 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
}
이거 완벽 해.