- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我想说,我已经查看了大量其他资源来尝试实现此目标,但我所查看的内容似乎都没有帮助。
例如: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
的大小确定,这就是为什么高度约束是相对于宽度的。
我尝试过 documentView
的 AutoresizingMask
、NSClipView
、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/
我有一个 NSScrollview 嵌套在另一个 NSScrollview 中。如何使内部 View 仅处理水平滚动?垂直滚动应该移动外部 View 。 目前我将 scrollWheel: 事件从内部
有谁知道将 NSScrollView 滚动到顶部的正确方法?我正在寻找与 UIView 的 scrollToTop 方法等效的方法。 到目前为止,这是我所拥有的,但在所有情况下都不完全正确 [self
我阅读了文档 Synchronizing Scroll Views ,并且完全按照文档进行,但是有一个问题。 我想同步一个 NSTableView 和一个 NSTextView。先让NSTableVi
当您轻轻滚动 NSScrollView 时,Cocoa 标记为脏的矩形并传递给 drawRect,通常很小(可能是对于垂直 ScrollView ,高度小至一或两个像素)。框架显然已经知道大部分内容是
我有一个 NSScrollview 其中包含两个 View ,让我们分别将它们称为View A 和View B,现在它们都可以增长高度,我希望 View A 出现在顶部和底部的 View B ,当两者
我在 Mac 上使用简单的 NSScrollView 时遇到了一个奇怪的问题。我刚刚开始使用 Cocoa 编程,但我之前有过在 iOS 上使用 UIKit 的经验。我将 NSScrollView 添加
我正在尝试将链接属性添加到 NSTextView 的 NSMutableString。 由于我只想使用 TextView 将链接添加到可见文本,因此我通过 的 NSViewBoundsDidChang
我打算在 NSScrollView 中使用 NSOutlineView,它不会紧贴顶部和底部边缘,因为我需要在顶部和底部滚动边缘插入阴影(重叠渐变)。轮廓 View 应该可以滚动到垂直顶部阴影下方和底
我的主窗口中有一个 NSScrollView 项目。每当我启动该程序时, ScrollView 中都会有文本,并且它从中心开始。用户不应该从顶部开始阅读,但为什么应用程序要在中心启动它?谢谢! 最佳答
我有一个 NSCollectionView,它列出了核心数据源中的项目。每个项目都有一个按钮,触发时会滑下操作 View 。当此 View 向下滑动时, Collection View 会缩小,以便两
我有一个 NSScrollView ,我向其中添加了一堆具有 NSImage subview 的 NSViews 。基本上它是 ScrollView 中包含的一长排缩略图。 一切都很好......直到
NSScrollView 在 Mac 应用程序中如何工作?我编写了以下代码,但滚动不起作用。 NSDictionary *temp=[[ NSDictionary alloc] init ]; NS
我正在尝试构建一个无尽的 NSScrollView,即可以在任一方向无限滚动的 ScrollView 。这是通过具有固定尺寸的 ScrollView 来实现的,一旦它太靠近任一边缘,该 ScrollV
我正在尝试使用 Lion 中的 NSScrollView 构建类似于在 iPhone 应用程序中如此流行的拉动刷新概念的东西,但是没有像 contentOffset 这样的属性,并且当我滚动到上面时,
我有一个 Cocoa 窗口,其内容 View 包含一个 NSScrollView,而 NSScrollView 又包含一个固定大小的 NSView。 启动程序后,最初显示的滚动条太小,就好像内容大小比
我目前在 NSScrollView 中有一个 NSView。NSView很大,我需要滚动来管理里面的对象。 我想在 NSView 的中心绘制一个静态矩形而不滚动。我想在NSView的drawRect方
我试图弄清楚 NSScrollView 的内容放大是如何工作的: 我有一个 NSScrollView,我试图在其中添加一个包含 NSTextField 的 NSView。 我使用文本字段创建 NSVi
我正在以编程方式在 NSScrollView 内创建 NSTableView,但是当我尝试将框架设置为 ScrollView 时,出现约束错误。 Unable to simultaneously sa
我需要在更大的滚动窗口内使用固定大小的 NSTextView。 IB 要求 TextView 位于它们自己的 NSScrollView 内部,即使它们的最小/最大尺寸是固定的,因此它们实际上不会滚动。
我有一个 NSScrollView,我试图用复选框填充它(NSButton/NSToggleButton)。我添加的复选框数量应该等于数组中的项目数量。这部分正在工作。 以下代码成功地将复选框添加到
我是一名优秀的程序员,十分优秀!