2016-10-20 5 views
0

오늘 (macOS) 오늘 목록 위젯을 가지고 놀고 있으며 위젯의 크기를 지정하기 위해 autolayout을 사용하고 있습니다. 이 위젯에는 사용자 정의 NSView가 포함되어있어 서식이 미리 지정된 텍스트 (거의 HTML pre 태그와 비슷 함)를 렌더링합니다.본질적인 크기가 사용 가능한 너비를 오버플로 할 때 비례하여 레이아웃 높이를 조정하십시오.

렌더링되는 텍스트에 따라 위젯은 본질적인 콘텐츠 크기를가집니다. 또한 설정된 프레임이 고유 크기보다 크거나 작 으면 올바르게 (아래 또는 위) 및 중앙으로 조정됩니다.

이것은 일반적으로 하나를 제외하고 많은 시나리오에서 잘 작동합니다. 오늘 위젯으로 표시 될 때 위젯의 너비는 특정 크기로 제한됩니다. 본질적인 크기가 사용 가능한 너비보다 크더라도 축소가 가능합니다. autolayout은 폭이 제한되어 있음에도 불구하고 여전히 위젯의 본질적인 높이를 사용하는 것으로 보입니다. 오늘보기 (400)의 폭보기 propertionally 400x200까지 확장으로 축소됩니다, 뷰의 고유 크기가 800x400 렌더링되고 있지만, 레이아웃의 높이가 여전히 보인다

/------------------\ 
| extra pad  | 
|------------------| 
|     | 
| downsized view | 
|     | 
|------------------| 
| extra pad  | 
\------------------/ 

예 : 그 방법은 내보기는과 같이, 높이 채워 나타납니다 원래 400이됩니다 (상단에 200 패딩이 있습니다 & 하단).

질문 : 스케일링을 고려하여 autolayout에게 어떻게 말합니까? 거의 -intrinsicSizeForMaxSize :와 같은 것으로 들립니다.

폭/높이 비율 제약 조건을 설정하여 압축 저항을 줄이고 포옹 우선 순위를 높이려고했으나 여분의 패딩을 죽이지는 않았습니다. autolayout이 오버플로 할 때 내재 된 크기를 고려하는 방법에 대해 뭔가 빠져 있다고 생각합니다.

답변

0

고유 크기를 사용하여 비율 제약 조건으로 전환되었습니다. 나는 여전히 뷰의 '네이티브'크기를 계산하지만 너비/높이 비율을 계산할 때만 사용합니다. 그런 다음 그 비율을 유지하기위한 제약 조건을 추가합니다. 잘 작동하는 것 같습니다.

let size = nativeSize // calculate the desired size 
    let ratio = size.height/size.width 

    if let rc = ratioConstraint { 
    rc.isActive = false 
    removeConstraint(rc) 
    } 

    ratioConstraint = 
    NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, 
         toItem: self, attribute: .width, 
         multiplier: ratio, constant: 0) 
    ratioConstraint?.isActive = true 

그럼 I 단지 수평 및 수직 모두 |[self]| 통해 컨테이너 뷰 핀 : 여기 관련 코드이다.

관련 문제