gpt4 book ai didi

macos - NSScrollView 与宽度匹配的 DocumentView

转载 作者:行者123 更新时间:2023-12-03 16:15:19 28 4
gpt4 key购买 nike

首先,我想说,我已经查看了大量其他资源来尝试实现此目标,但我所查看的内容似乎都没有帮助。

例如:Automatically grow document view of NSScrollView using auto layout?

我有一个在 Interface Builder 中创建的 NSScrollView,并设置了约束来填充它所在的窗口: ScrollView 的顶部、左侧、右侧和底部设置为等于 ScrollView 的顶部、左侧、右侧和底部superview(这是 Xamarin 中 View Controller 使用的 xib View )。

我想要的文档 View 是一个简单的 NSView,它在我的 View Controller 的 ViewDidLoad 中动态填充 NSImageView:

EventListScrollView.TranslatesAutoresizingMaskIntoConstraints = false;

var documentView = new NSView(EventListScrollView.Bounds);
//documentView.AutoresizingMask = NSViewResizingMask.WidthSizable | NSViewResizingMask.HeightSizable;
//documentView.TranslatesAutoresizingMaskIntoConstraints = false;

NSView lastHeader = null;
foreach(var project in _projects)
{
var imageView = new NSImageView();
imageView.TranslatesAutoresizingMaskIntoConstraints = false;
imageView.SetContentCompressionResistancePriority(1, NSLayoutConstraintOrientation.Horizontal);
imageView.SetContentCompressionResistancePriority(1, NSLayoutConstraintOrientation.Vertical);
imageView.ImageScaling = NSImageScale.ProportionallyUpOrDown;

var xPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Left, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Left, 1, 0);
NSLayoutConstraint yPosConstraint = null;
if(lastHeader!=null)
{
yPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, lastHeader, NSLayoutAttribute.Bottom, 1, 0);
}
else
{
yPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Top, 1, 0);
}

var widthConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Width, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Width, 1, 0);
var heightConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Height, NSLayoutRelation.Equal, imageView, NSLayoutAttribute.Width, (nfloat)0.325, 0);

documentView.AddSubview(imageView);
documentView.AddConstraints(new[] { xPosConstraint, yPosConstraint, widthConstraint, heightConstraint });

lastHeader = imageView;
ImageService.Instance.LoadUrl($"https:{project.ProjectLogo}").Into(imageView);
}

EventListScrollView.DocumentView = documentView;

因为我不一定知道 _projects 中有多少个项目,而且我也不知道将加载到每个 imageView 中的图像的高度我确实知道预期的比例,但直到运行时我才知道文档 View 的高度。

我希望每次 ScrollView 位于封闭窗口时(因此也是 ScrollView ),将 documentView 的宽度调整为与 NSClipView 相同已调整大小。至于 documentView 的高度,我希望它由我在 documentView 中填充的 imageView 的大小确定,这就是为什么高度约束是相对于宽度的。

我尝试过 documentViewAutoresizingMaskNSClipView、scrollview 等。我尝试设置 将所有内容的 AutoresizingMaskIntoConstraints 转换为 false 并添加约束以将 documentView 的 Left、Right 和 Top 设置为等于 NSClipView 的 Left、Right 和 Top >。当我这样做时, View 似乎根本没有出现。我似乎无法弄清楚这一点。

我也尝试过在不使用 NSImageViews 的情况下执行此操作:

public override void ViewDidLoad()
{
base.ViewDidLoad();

EventListScrollView.TranslatesAutoresizingMaskIntoConstraints = false;
var clipView = new NSClipView
{
TranslatesAutoresizingMaskIntoConstraints = false
};

EventListScrollView.ContentView = clipView;
EventListScrollView.AddConstraint(NSLayoutConstraint.Create(clipView, NSLayoutAttribute.Left, NSLayoutRelation.Equal, EventListScrollView, NSLayoutAttribute.Left, 1, 0));
EventListScrollView.AddConstraint(NSLayoutConstraint.Create(clipView, NSLayoutAttribute.Right, NSLayoutRelation.Equal, EventListScrollView, NSLayoutAttribute.Right, 1, 0));
EventListScrollView.AddConstraint(NSLayoutConstraint.Create(clipView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, EventListScrollView, NSLayoutAttribute.Top, 1, 0));
EventListScrollView.AddConstraint(NSLayoutConstraint.Create(clipView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, EventListScrollView, NSLayoutAttribute.Bottom, 1, 0));

var documentView = new NSView();
documentView.WantsLayer = true;
documentView.Layer.BackgroundColor = NSColor.Black.CGColor;
documentView.TranslatesAutoresizingMaskIntoConstraints = false;
EventListScrollView.DocumentView = documentView;
clipView.AddConstraint(NSLayoutConstraint.Create(documentView, NSLayoutAttribute.Left, NSLayoutRelation.Equal, clipView, NSLayoutAttribute.Left, 1, 0));
clipView.AddConstraint(NSLayoutConstraint.Create(documentView, NSLayoutAttribute.Right, NSLayoutRelation.Equal, clipView, NSLayoutAttribute.Right, 1, 0));
clipView.AddConstraint(NSLayoutConstraint.Create(documentView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, clipView, NSLayoutAttribute.Top, 1, 0));

NSView lastHeader = null;
foreach(var project in _projects)
{
var random = new Random();

var imageView = new NSView();
imageView.TranslatesAutoresizingMaskIntoConstraints = false;
imageView.WantsLayer = true;
imageView.Layer.BackgroundColor = NSColor.FromRgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)).CGColor;

var xPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Left, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Left, 1, 0);
NSLayoutConstraint yPosConstraint = null;
if(lastHeader!=null)
{
yPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, lastHeader, NSLayoutAttribute.Bottom, 1, 0);
}
else
{
yPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Top, 1, 0);
}

var widthConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Width, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Width, 1, 0);
var heightConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Height, NSLayoutRelation.Equal, imageView, NSLayoutAttribute.Width, (nfloat)0.325, 0);

documentView.AddSubview(imageView);
documentView.AddConstraints(new[] { xPosConstraint, yPosConstraint, widthConstraint, heightConstraint });

lastHeader = imageView;
}
}

最佳答案

我明白了。因此,这样做的技巧是,除非您将 documentView 的底部固定到最后一个 subview ,否则 documentView 将不知道自己要多大。您可以使用视觉格式来做到这一点,但如果您直到运行时才真正知道您的 View 是什么,那就有点过分了。这是对我有用的代码:

public override void ViewDidLoad()
{
base.ViewDidLoad();

var clipView = EventListScrollView.ContentView;

var documentView = new FlippedView();
documentView.TranslatesAutoresizingMaskIntoConstraints = false;
EventListScrollView.DocumentView = documentView;
clipView.AddConstraint(NSLayoutConstraint.Create(documentView, NSLayoutAttribute.Left, NSLayoutRelation.Equal, clipView, NSLayoutAttribute.Left, 1, 0));
clipView.AddConstraint(NSLayoutConstraint.Create(documentView, NSLayoutAttribute.Right, NSLayoutRelation.Equal, clipView, NSLayoutAttribute.Right, 1, 0));
clipView.AddConstraint(NSLayoutConstraint.Create(documentView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, clipView, NSLayoutAttribute.Top, 1, 0));

NSView lastHeader = null;
foreach (var project in _projects)
{
var imageView = new NSImageView();
imageView.TranslatesAutoresizingMaskIntoConstraints = false;
imageView.SetContentCompressionResistancePriority(1, NSLayoutConstraintOrientation.Horizontal);
imageView.SetContentCompressionResistancePriority(1, NSLayoutConstraintOrientation.Vertical);
imageView.ImageScaling = NSImageScale.ProportionallyUpOrDown;

var xPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Left, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Left, 1, 0);
NSLayoutConstraint yPosConstraint = null;
if (lastHeader != null)
{
yPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, lastHeader, NSLayoutAttribute.Bottom, 1, 0);
}
else
{
yPosConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Top, 1, 0);
}

var widthConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Width, NSLayoutRelation.Equal, documentView, NSLayoutAttribute.Width, 1, 0);
var heightConstraint = NSLayoutConstraint.Create(imageView, NSLayoutAttribute.Height, NSLayoutRelation.LessThanOrEqual, imageView, NSLayoutAttribute.Width, (nfloat)0.360, 0);

documentView.AddSubview(imageView);
documentView.AddConstraint(xPosConstraint);
documentView.AddConstraint(yPosConstraint);
documentView.AddConstraint(widthConstraint);
documentView.AddConstraint(heightConstraint);

lastHeader = imageView;
ImageService.Instance.LoadUrl($"https:{project.ProjectLogo}").Into(imageView);
}

if(lastHeader!=null)
{
var bottomPinConstraint = NSLayoutConstraint.Create(documentView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, lastHeader, NSLayoutAttribute.Bottom, 1, 0);
documentView.AddConstraint(bottomPinConstraint);
}
}

关键是最后一个约束 - bottomPinConstraint。这允许 documentView 扩展其高度以适应所有 subview 。

此外,即使我在 NSClipView 和我的 documentView 之间设置约束,我仍然需要使用带有 IsFlipped = true; 的 View code> 手动,否则它将忽略约束并将我的 View 固定到 NSClipView 的底部。我的 EventListScrollView 是在 Interface Builder 中创建的,并设置了约束以使其填充其所在的整个窗口。

最终结果是一个带有 DocumentView 的 NSScrollView,它填充了 ScrollView 的宽度,但也垂直扩展以适合我以编程方式添加到其中的 subview 。

关于macos - NSScrollView 与宽度匹配的 DocumentView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957633/

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