我有一个NSScrollView的子类。在该scrollView的documentView中,我有几个NSView。最后,我将一个名为 aView 的NSView添加到documentView。
我希望 aView 位于documentView的底部,只要不需要滚动即可。只能沿y轴滚动。
如果documentView对于contentView来说太高了 - 所以需要滚动 - 我希望 aView 显示在contentView的底部。
这适用于您在下面看到的代码。
这是我的问题: 我开始滚动的那一刻,我希望 aView 保留在contentView的底部,但 aView 只需滚动显示documentView中的所有其他视图。 换句话说:如果需要滚动,我希望将 aView的位置固定在我的scrollView的可见rect的底部,如果contentView为高,则将其固定在documentView的底部足以显示整个documentView。
有办法吗?我哪里出错?
这是我的子类NSScrollView中的代码:
[documentView addSubview:aView];
aView.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *documentAViewBottom = [NSLayoutConstraint constraintWithItem:documentView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:aView attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
documentAViewBottom.priority = NSLayoutPriorityDefaultHigh;
[documentView addConstraint:documentAViewBottom];
NSLayoutConstraint *aViewMaxYEdge = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:aView attribute:NSLayoutAttributeBottom multiplier:1 constant:5];
[self addConstraint:aViewMaxYEdge];
[documentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[aView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(aView)]];
答案 0 :(得分:2)
我有点老了,NSLayoutConstraints对我没有吸引力,所以这是另一个提议的手动解决方案
设置文档视图时从NSScrollView的子类
[self.contentView setPostsBoundsChangedNotification:YES];
然后订阅更改的边界
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentViewDidScroll:)
name:NSViewBoundsDidChangeNotification object:self.contentView];
然后在
-(void)contentViewDidScroll
{
double widthOfAView = aView.frame.size.width;
double heightOfAView = aView.frame.size.height;
[aView setFrameOrigin:NSMakePoint(NSMinX(self.contentView.bounds) - widthOfAView, NSMaxY(self.contentView.bounds) - heightOfAView)];
}
所有这一切都假设您的isFlipped被覆盖为YES,当然。