Kur*_*rly 4 macos cocoa objective-c autolayout
我似乎无法弄清楚如何使NSScrollView内的内容正确扩展.我看到了一些描述一般方法的参考文献,但没有具体的内容.
这似乎表明NSScrollView和Auto Layout不能很好地协同工作.有点说明iOS和OSX自动布局指南示例都是UIScrollView而不是NSScrollView:
我把一个例子拼凑在一起.主窗口包含一个拆分视图,右侧有一些固定内容,一个视图将在左侧以编程方式填充.(我会张贴一张照片,但我还没有所需的声誉).运行下面的代码,任何移动分割器的尝试都会导致它回到原始位置.
AppDelegate.h
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (weak) IBOutlet NSScrollView *scrollView;
@property (strong, nonatomic) NSView *containerView;
@property (strong, nonatomic) NSMutableDictionary *views;
@property (assign) IBOutlet NSWindow *window;
@end
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize scrollView;
@synthesize containerView;
@synthesize views;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
}
-(void)awakeFromNib {
// Create a container to hold all the subviews
containerView = [[NSView alloc] initWithFrame:NSZeroRect];
[containerView setTranslatesAutoresizingMaskIntoConstraints:NO];
[scrollView setDocumentView:containerView];
views = [[NSMutableDictionary alloc] init];
for (int i=0; i<8; i++) {
NSBox *box = [[NSBox alloc] init];
NSString *title = [NSString stringWithFormat:@"Box%@", [[NSNumber numberWithInt:i] stringValue]];
box.title = title;
[views setObject:box forKey:title];
[box setTranslatesAutoresizingMaskIntoConstraints:NO];
[containerView addSubview:box];
}
long height = 160;
NSArray *sortedKeys = [[views allKeys] sortedArrayUsingSelector: @selector(compare:)];
for(NSString *viewName in sortedKeys) {
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[[NSString alloc] initWithFormat:@"|-20-[%@]-20-|", viewName] options:0 metrics:nil views:views]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[[NSString alloc] initWithFormat:@"V:[%@(==%ld)]",viewName, height] options:0 metrics:nil views:views]];
}
// Build the subview-to-subview constraint string
NSString *constraintString = @"V:|";
for(NSString *viewName in sortedKeys) {
constraintString = [constraintString stringByAppendingString:[NSString stringWithFormat:@"-20-[%@]",viewName]];
}
// Subview-to-subview constraints
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constraintString options:0 metrics:nil views:views]];
// Container view constraints
NSDictionary *topLevelDictionary = NSDictionaryOfVariableBindings(containerView);
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[containerView]-0-|" options:0 metrics:nil views:topLevelDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[containerView]" options:0 metrics:nil views:topLevelDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[[NSString alloc] initWithFormat:@"V:|[containerView(==%ld)]", (long)(20 + height) * sortedKeys.count + 20] options:0 metrics:nil views:topLevelDictionary]];
}
@end
Run Code Online (Sandbox Code Playgroud)
任何方向将不胜感激.
War*_*ton 10
我有同样的问题.Autolayout和NSSplitView非常好地一起玩,你只需要牺牲正确的鸡肉.
尝试在相关的分割部分设置稍高的保持优先级.图像显示我最右边的分割将优先考虑.

另一个考虑因素.相关分割宽度的内容是否受到限制?您可能需要在其宽度上设置大于或等于约束,例如|-0-[mysplitcontent(>=minwidth)]-0-|