当显示窗格的实时调整大小时,它在拖动时很困难,并且窗格顶部在释放后被隐藏

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 中的新功能”之类的内容可能正是您想要的。 你会试试的。谢谢。我将问题的描述更改为更具描述性。 延迟更新。但是我整理好了!我正在使用计时器来调整窗格的大小。当我让委托类处理拖动时,它顺利地处理了事件。了解委托可以更好地控制活动顺序。希望这会有所帮助...

以上是关于当显示窗格的实时调整大小时,它在拖动时很困难,并且窗格顶部在释放后被隐藏的主要内容,如果未能解决你的问题,请参考以下文章

实时克隆影片剪辑

使用页面宽度调整大小更改图像

当浏览器调整大小时,不断在视频上移动可调整大小/可拖动的图像

为大型应用程序进行分析时很困难

在屏幕大小更改时触发 javascript

JavaFX:通过窗口大小调整来调整GridPane的大小