当显示窗格的实时调整大小时,它在拖动时很困难,并且窗格顶部在释放后被隐藏
Posted
技术标签:
【中文标题】当显示窗格的实时调整大小时,它在拖动时很困难,并且窗格顶部在释放后被隐藏【英文标题】:When showing the real time resizing of a pane, it struggles while dragging and top of the pane is hidden after released 【发布时间】:2014-01-26 15:22:19 【问题描述】:我浏览了几篇关于拖动的帖子,但找不到问题的答案。
我可以使用 mouseDown 和 mouseUp 事件来跟踪当前位置并重新绘制调整大小的窗格。我想要的是显示窗格的实时移动。每次触发 mouseDragged 事件时,都会获取新位置的 y 坐标并调用 setFrame 进行重绘。窗口似乎闪烁并最终卡住(标题栏超出范围并隐藏),因为它似乎错过了运行循环中的最终事件。
有没有办法解决这个问题?
视图已通过以下方式实现
NSSplitView(分为左码头、右码头等部分) NSView 用于在dock内部实现子视图 NSTableView 用于在 NSView 内部容纳多个“面板” 此表视图内可以有多个面板(一个在另一个下方)我需要通过拖动边框线来调整这些面板的大小。为此,我在底部使用了NSButton
。(我想在那里显示更粗的分隔线)
这里是 mouseDown、mouseUp、mouseDragged 回调的代码,用于调整面板大小
-(void)mouseDown:(NSEvent *)theEvent
draggingInProgress = YES;
firstDraggingPointFound = NO;
-(void)mouseUp:(NSEvent *)theEvent
if (!draggingInProgress)
return;
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
if (firstDraggingPointFound)
[_delegate heightChanged:[NSNumber numberWithFloat:(point.y - previousDragPosition)]];
draggingInProgress = NO;
[_delegate heightChangingEnded]; //draggingInProgress is set to NO
-(void)mouseDragged:(NSEvent *)theEvent
if (!draggingInProgress)
return;
NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
if (firstDraggingPointFound)
[_delegate heightChanged:[NSNumber numberWithFloat:(point.y - previousDragPosition)]];
else
firstDraggingPointFound = YES;
previousDragPosition = point.y;
//Delegate method
-(void)heightChanged:(NSNumber *)change
NSRect f = [[self view] frame];
f.size.height += [change floatValue];
if (f.size.height < 100)
f.size.height = 100;
[[self view] setFrame:f];
[self.panelViewModel setPanelHeight:f.size.height];
if (_heightChangeDelegate)
[_heightChangeDelegate heightChangedForPanel:self];
[[self view] setFrame:f];
这里会出现什么问题? 有没有更好的方法来做到这一点?
【问题讨论】:
【参考方案1】:首先,我不会用“Panel”这个词来描述你想要什么,因为“NSPanel”是一种“NSWindow”。我们称它们为“窗格”。
其次,我不会使用 NSTableView 来包含您的窗格。 NSTableView 真的不是为此而设计的,它是为表格数据设计的。您可以使用专为它设计的 NSStackView,或者仅使用原始约束和自动布局,手动将每个窗格的顶部设置为与前一个窗格的底部相同。
【讨论】:
非常感谢您的回复 :) 有没有你推荐的关于 NSStackView 的好文章? 我实际上还没有机会使用它,但我认为它已在今年的 WWDC 上亮相,因此您应该查看会话。 “AppKit 中的新功能”之类的内容可能正是您想要的。 你会试试的。谢谢。我将问题的描述更改为更具描述性。 延迟更新。但是我整理好了!我正在使用计时器来调整窗格的大小。当我让委托类处理拖动时,它顺利地处理了事件。了解委托可以更好地控制活动顺序。希望这会有所帮助...以上是关于当显示窗格的实时调整大小时,它在拖动时很困难,并且窗格顶部在释放后被隐藏的主要内容,如果未能解决你的问题,请参考以下文章