gpt4 book ai didi

objective-c - 嵌入 NSSplitView 的 NSScrollView 中的 NSView 的自动布局

转载 作者:太空狗 更新时间:2023-10-30 03:58:48 31 4
gpt4 key购买 nike

我似乎无法弄清楚如何让 NSScrollView 中的内容正确缩放。我遇到了一些描述一般方法但没有具体内容的引用资料。

Ambiguous Layout

这似乎表明 NSScrollView 和自动布局不能很好地协同工作。这有点说明 iOS 和 OSX 自动布局指南示例都是 UIScrollView 而不是 NSScrollView:

Auto Layout Examples

我举了一个例子。主窗口包含一个 Split View,右侧有一些固定内容,左侧有一个将以编程方式填充的 View 。 (我会张贴图片,但我还没有所需的声誉)。运行下面的代码,任何移动拆分器的尝试都会导致它弹回到原来的位置。

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

任何方向将不胜感激。

最佳答案

我遇到了同样的问题。 Autolayout 和 NSSplitView 配合得很好,你只需要牺牲正确的鸡种。

尝试将相关拆分部分的持有优先级设置得稍微高一些。该图像显示我最右边的拆分将优先。

enter image description here

还有一个考虑。相关拆分宽度的内容是否受限?您可能需要对其宽度设置一个大于或等于约束,例如 |-0-[mysplitcontent(>=minwidth)]-0-|

关于objective-c - 嵌入 NSSplitView 的 NSScrollView 中的 NSView 的自动布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20810116/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com