자동 레이아웃을 사용하여 레이아웃을 시도하는 프로그래밍 방식으로 (즉, NIB/XIB가 아닌) 빌드 된 OSX Cocoa 앱이 있습니다. 하지만 윈도우가 처음 표시 될 때 이상한 행동을하고 있습니다.자동 레이아웃이있는 NSScrollView가 첫 번째 수동 윈도우 크기가 조정될 때까지 크기가 조절되지 않습니다.
내 주요 콘텐츠는 보유하고있는 NSView이며 NSView는 100 개의 NSButton을 하위 뷰로 세로로 배치되어 있습니다. 버튼들은 모두 NSView와 다른 것들에 상대적으로 제한됩니다; NSView와 모든 NSButton에는 모두 translatesAutoresizingMaskIntoConstraints=NO
이 설정됩니다. NSView에 기본 창의 contentView를 설정하면 버튼이 예상대로 표시되기 때문에 콘텐츠보기의 코드가 좋다고 생각합니다 (예 : 모호한 레이아웃 등).
그러나 메인 윈도우의 contentView를 NSScrollView로 설정하고 NSView의 NSViewView의 documentView를 NSView로 설정하면 디스플레이 문제가 발생합니다. 첫째 디스플레이에
, 나는 빈 창을받을 - 아니 스크롤 막대를, 아무것도 :
NSScrollView이 translatesAutoresizingMaskIntoConstraints=NO
있습니다. 디버그 목적을 위해 NSScrollView의 배경색을 파란색으로 설정 했으므로 어디에 배치되는지 확인할 수 있습니다. 그러나 아무 곳에 나 파란색이 표시되지 않습니다. 예상대로 내가 창 크기를 조정으로
그러나, 곧, 레이아웃에서 개막, 나는 파란색 배경, 메인 윈도우의 전체 크기 NSScrollView를 얻고, 스크롤 :
문제는 NSScrollView의 일부인 clipView에 제약 조건이 없다는 것을 나타내는 몇 가지 참조를 읽었습니다. 그 근거로, 제약 조건을 [NSScrollView contentView]
에서 [NSScrollView documentView]
으로 수직 및 수평 방향 (상수 0, 배율 1, 왼쪽, 오른쪽, 상단 및 하단)으로 바인딩 설정을 시도했습니다. 이 작업을 수행하면 NSScrollView가 첫 번째 디스플레이에 표시되지만 크기가 잘못되었습니다. 스크롤은 내부 내용의 전체 높이를 스크롤하지 않습니다. 스크롤 가능한 내용은 보이는 창과 크기가 같은 것처럼 스크롤됩니다. 나는 창 크기를 조정 한 빨리, 제약 조건은 (이전 스크린 샷 참조) 내가 예상대로 킥, 및 윈도우 디스플레이,
다시 : 마지막으로, 내용은 창의 제목 표시 줄을 겹쳐 . 그래서, 나는 여분의 제약으로 인해 상처를 입지는 않지만 아무것도 추가하지 않는 것 같습니다.
더 혼란스러운 문제 - 버튼을 모두 끈 상태에서 컨텐츠 뷰로 서브 뷰가없는 비어있는 NSView를 사용하면 예상대로 파란색으로 시작할 때 파란색 창이 나타납니다.
그래서 - 여기 무슨 일 이니? 버튼에 대한 제약 조건 평가를 강제하는 호출이 누락 된 것처럼 느껴집니다. 그 사건인가, 아니면 다른 일이 여기에 있습니까?
관심있는 사람들을 위해 - 여기 내 샘플 코드가 있습니다. Objective C가 아니라 Python입니다. 그러나 언어 바인딩은 Python 메서드 이름을 Objective C 메시지로 변환 할 수 있습니다. 나는 그것과 완전히 행복하지 않다, 그러나 작동하는 것 같다 - 내가 대답을 근무했습니다
app = NSApplication.sharedApplication()
app.setActivationPolicy_(NSApplicationActivationPolicyRegular)
main_window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(
NSMakeRect(100, 100, 640, 480),
NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask,
NSBackingStoreBuffered,
False)
scrollview = NSScrollView.alloc().init()
scrollview.setHasVerticalScroller_(True)
scrollview.setHasHorizontalScroller_(True)
scrollview.setAutohidesScrollers_(True)
scrollview.setBorderType_(NSNoBorder)
scrollview.setTranslatesAutoresizingMaskIntoConstraints_(False)
scrollview.backgroundColor = NSColor.blueColor()
container = NSView.alloc().init()
container.setTranslatesAutoresizingMaskIntoConstraints_(False)
buttons = [
NSButton.alloc().init()
for b in range(0, 100)
]
for i, button in enumerate(buttons):
button.setBezelStyle_(NSRoundedBezelStyle)
button.setButtonType_(NSMomentaryPushInButton)
button.setTitle_(get_NSString('Button %s' % i))
button.setTranslatesAutoresizingMaskIntoConstraints_(False)
container.addSubview_(button)
if i == 0:
container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_(
button, NSLayoutAttributeTop,
NSLayoutRelationEqual,
container, NSLayoutAttributeTop,
1, 50,
))
else:
container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_(
button, NSLayoutAttributeBottom,
NSLayoutRelationEqual,
buttons[i-1], NSLayoutAttributeBottom,
1, 50,
))
container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_(
button, NSLayoutAttributeLeft,
NSLayoutRelationEqual,
container, NSLayoutAttributeLeft,
1, 50,
))
container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_(
button, NSLayoutAttributeRight,
NSLayoutRelationEqual,
container, NSLayoutAttributeRight,
1, -50,
))
container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_(
buttons[-1], NSLayoutAttributeBottom,
NSLayoutRelationEqual,
container, NSLayoutAttributeBottom,
1, -50,
))
scrollview.setDocumentView_(container)
main_window.setContentView_(scrollview)
main_window.makeKeyAndOrderFront_(None)
app.activateIgnoringOtherApps_(True)
app.run()
문제에 대한 추가 설명이 될 수있는 설명 - 크기 조정 *은 가로 크기 조정이어야합니다. 수직 크기 조정은 구속 조건을 재평가하지 않습니다. 그러나 세로로 크기를 조정 한 다음 가로 크기를 조정하면 모든 것이 화면을 채우도록 조정됩니다. – freakboy3742
두 번째 설명 -이 코드는 Mavericks에서 예상대로 정확하게 작동하지만 Mountain Lion에서는 문제가 발생합니다. – freakboy3742