NSView의 드래그로 창 드래그
14450 단어 MacOSXNSViewObjective-C
개요
GitHub
구현
맞춤 보기(DraggingView)
맞춤 보기(DraggingView)
#import "DraggingView.h"
@interface DraggingView()
@property NSPoint currentPoint;
@end
@implementation DraggingView
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
// Drawing code here.
// 分かりやすいようにビューに色を付ける
NSRect bounds = [self bounds];
[[[NSColor blueColor] colorWithAlphaComponent:0.1] set];
[NSBezierPath fillRect:bounds];
}
#pragma mark Events
- (void)mouseDown:(NSEvent *)event {
NSPoint p = [event locationInWindow];
_currentPoint = [self convertPoint:p fromView:nil]; // viewの座標系に変換
[self setNeedsDisplay:YES];
}
- (void)mouseDragged:(NSEvent *)event {
NSPoint previousPoint = _currentPoint;
NSPoint p = [event locationInWindow];
_currentPoint = [self convertPoint:p fromView:nil]; // viewの座標系に変換
// 移動したマウスの距離だけウィンドウの位置を移動させる
double distance_x = _currentPoint.x - previousPoint.x;
double distance_y = _currentPoint.y - previousPoint.y;
NSRect windowFrame = self.window.frame;
NSPoint windowOrigin = windowFrame.origin; // 現在のウィンドウ位置
windowOrigin.x += distance_x;
windowOrigin.y += distance_y;
_currentPoint.x -= distance_x; // ウィンドウの位置が変わったので、次のマウス移動の計算のために補正を行う
_currentPoint.y -= distance_y;
[self.window setFrameOrigin:windowOrigin]; // ウィンドウの位置を移動
[self setNeedsDisplay:YES];
}
- (void)mouseUp:(NSEvent *)event {
NSPoint p = [event locationInWindow];
_currentPoint = [self convertPoint:p fromView:nil]; // viewの座標系に変換
[self setNeedsDisplay:YES];
}
@end
NSView
는 NSResponder
를 상속하고 있으며, 이는 이벤트를 처리하는 메소드를 정의합니다. mouseDown
mouseDragged
mouseUp
를 사용합니다.- (void)mouseDown:(NSEvent *)event {
NSPoint p = [event locationInWindow];
_currentPoint = [self convertPoint:p fromView:nil]; // viewの座標系に変換
[self setNeedsDisplay:YES];
}
NSEvent
객체로부터 작성할 수 있는 좌표 정보는 윈도우의 것이므로, 이번은 필요 없지만, 편리성을 위해 NSView
의 좌표계로 변환하는 경우가 많다. _currentPoint
에 눌려진 위치를 기록하십시오 - (void)mouseDragged:(NSEvent *)event {
NSPoint previousPoint = _currentPoint;
NSPoint p = [event locationInWindow];
_currentPoint = [self convertPoint:p fromView:nil]; // viewの座標系に変換
// 移動したマウスの距離だけウィンドウの位置を移動させる
double distance_x = _currentPoint.x - previousPoint.x;
double distance_y = _currentPoint.y - previousPoint.y;
previousPoint
에 저장 _currentPoint
에 저장 NSRect windowFrame = self.window.frame;
NSPoint windowOrigin = windowFrame.origin; // 現在のウィンドウ位置
windowOrigin.x += distance_x;
windowOrigin.y += distance_y;
_currentPoint.x -= distance_x; // ウィンドウの位置が変わったので、次のマウス移動の計算のために補正を行う
_currentPoint.y -= distance_y;
[self.window setFrameOrigin:windowOrigin]; // ウィンドウの位置を移動
[self setNeedsDisplay:YES];
이때
_currentPoint
를 갱신해 두는 것을 잊지 않게._currentPoint
를 보완하지 않으면 다음 드래그 거리 계산 시에 어긋남이 발생한다. - (void)mouseUp:(NSEvent *)event {
NSPoint p = [event locationInWindow];
_currentPoint = [self convertPoint:p fromView:nil]; // viewの座標系に変換
[self setNeedsDisplay:YES];
}
참고
NSView
를 투명도를 바꾸어 채우는 방법Reference
이 문제에 관하여(NSView의 드래그로 창 드래그), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/IKEH/items/c65db8c58adb1c0f9f7c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)