UIPanGestureRecognizer를 사용하여 개체를 이동하는 방법은 무엇입니까?아이폰/아이패드
몇 가지 예가 있습니다.UIPanGestureRecognizer
수업. 예를 들어, 나는 이것을 읽었지만 여전히 그것을 사용할 수 없습니다.
제가 작업 중인 nib 파일에UIView
(이미지의 흰색 사각형) 해당 클래스와 함께 끌면 됩니다.
그리고 내 .m 파일에 다음과 같이 넣었습니다.
- (void)setTranslation:(CGPoint)translation inView:(UIView *)view
{
NSLog(@"Test to see if this method gets executed");
}
마우스를 끌어다 놓으면 해당 방법이 실행되지 않습니다.UIView
또한 다음을 배치해 보았습니다.
- (void)pan:(UIPanGestureRecognizer *)gesture
{
NSLog(@"testing");
}
그리고 그 방법도 실행되지 않습니다.제가 틀렸을 수도 있지만 저는 이 방법이 다음과 같이 작동해야 한다고 생각합니다.- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
내가 그 메소드를 배치하기만 하면 터치가 있을 때마다 호출됩니다.
내가 뭘 잘못하고 있는 거지?혹시 그 방법에 연관성을 그려야 하나요?그렇다면 어떻게 해야 합니까?
UIGesture Recognizer로 작업하는 튜토리얼을 찾았는데, 이것이 바로 제가 찾고 있는 것 같습니다.이를 통해 다음과 같은 해결책을 도출할 수 있었습니다.
-(IBAction) someMethod {
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
[panRecognizer setMinimumNumberOfTouches:1];
[panRecognizer setMaximumNumberOfTouches:1];
[ViewMain addGestureRecognizer:panRecognizer];
[panRecognizer release];
}
-(void)move:(UIPanGestureRecognizer*)sender {
[self.view bringSubviewToFront:sender.view];
CGPoint translatedPoint = [sender translationInView:sender.view.superview];
if (sender.state == UIGestureRecognizerStateBegan) {
firstX = sender.view.center.x;
firstY = sender.view.center.y;
}
translatedPoint = CGPointMake(sender.view.center.x+translatedPoint.x, sender.view.center.y+translatedPoint.y);
[sender.view setCenter:translatedPoint];
[sender setTranslation:CGPointZero inView:sender.view];
if (sender.state == UIGestureRecognizerStateEnded) {
CGFloat velocityX = (0.2*[sender velocityInView:self.view].x);
CGFloat velocityY = (0.2*[sender velocityInView:self.view].y);
CGFloat finalX = translatedPoint.x + velocityX;
CGFloat finalY = translatedPoint.y + velocityY;// translatedPoint.y + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y);
if (finalX < 0) {
finalX = 0;
} else if (finalX > self.view.frame.size.width) {
finalX = self.view.frame.size.width;
}
if (finalY < 50) { // to avoid status bar
finalY = 50;
} else if (finalY > self.view.frame.size.height) {
finalY = self.view.frame.size.height;
}
CGFloat animationDuration = (ABS(velocityX)*.0002)+.2;
NSLog(@"the duration is: %f", animationDuration);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidFinish)];
[[sender view] setCenter:CGPointMake(finalX, finalY)];
[UIView commitAnimations];
}
}
UIPanGestureRecognizer * pan1 = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(moveObject:)];
pan1.minimumNumberOfTouches = 1;
[image1 addGestureRecognizer:pan1];
-(void)moveObject:(UIPanGestureRecognizer *)pan;
{
image1.center = [pan locationInView:image1.superview];
}
-(IBAction)Method
{
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[panRecognizer setMinimumNumberOfTouches:1];
[panRecognizer setMaximumNumberOfTouches:1];
[ViewMain addGestureRecognizer:panRecognizer];
[panRecognizer release];
}
- (Void)handlePan:(UIPanGestureRecognizer *)recognizer
{
CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
if (recognizer.state == UIGestureRecognizerStateEnded) {
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;
NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);
float slideFactor = 0.1 * slideMult; // Increase for more of a slide
CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor),
recognizer.view.center.y + (velocity.y * slideFactor));
finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width);
finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height);
[UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
recognizer.view.center = finalPoint;
} completion:nil];
}
}
@스위프트5에서 남토노의 답변(수락)
func someMethod() {
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(move))
panGestureRecognizer.minimumNumberOfTouches = 1
panGestureRecognizer.maximumNumberOfTouches = 1
view.addGestureRecognizer(panGestureRecognizer)
}
@objc func move(sender: UIPanGestureRecognizer) {
guard let senderView = sender.view else { return }
self.view.bringSubviewToFront(senderView)
var translatedPoint: CGPoint = sender.translation(in: senderView.superview)
if(sender.state == .began) {
let firstX = senderView.center.x
let firstY = senderView.center.y
}
translatedPoint = CGPoint(x: senderView.center.x + translatedPoint.x, y: senderView.center.y + translatedPoint.y)
senderView.center = translatedPoint
sender.setTranslation(.zero, in: senderView)
if(sender.state == .ended) {
let velocityX: CGFloat = (0.2 * sender.velocity(in: self.view).x)
let velocityY: CGFloat = (0.2 * sender.velocity(in: self.view).y)
var finalX: CGFloat = translatedPoint.x + velocityX
var finalY: CGFloat = translatedPoint.y + velocityY
if(finalX < 0) {
finalX = 0
} else if (finalX > self.view.frame.size.width) {
finalX = self.view.frame.size.width;
}
if (finalY < 50) { // to avoid status bar
finalY = 50;
} else if (finalY > self.view.frame.size.height) {
finalY = self.view.frame.size.height;
}
let animationDuration: TimeInterval = TimeInterval(abs(velocityX) * 0.0002 + 0.2)
print("the animation duration is \(animationDuration)")
UIView.animate(withDuration: animationDuration, delay: 0, options: .curveEaseOut) {
senderView.center = CGPoint(x: finalX, y: finalY)
} completion: { completed in
// call animationDidFinish completion handler here
}
}
}
if ([recognizer state] == UIGestureRecognizerStateChanged)
{
CGPoint translation1 = [recognizer translationInView:main_view];
img12.center=CGPointMake(img12.center.x+translation1.x, img12.center.y+ translation1.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:main_view];
recognizer.view.center=CGPointMake(recognizer.view.center.x+translation1.x, recognizer.view.center.y+ translation1.y);
}
-(void)move:(UIPanGestureRecognizer*)recognizer
{
if ([recognizer state] == UIGestureRecognizerStateChanged)
{
CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center=CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y+ translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
}
}
@MS AppTech 답변의 빠른 2가지 버전
func handlePan(panGest : UIPanGestureRecognizer) {
let velocity : CGPoint = panGest.velocityInView(self.view);
let magnitude : CGFloat = CGFloat(sqrtf((Float(velocity.x) * Float(velocity.x)) + (Float(velocity.y) * Float(velocity.y))));
let slideMult :CGFloat = magnitude / 200;
//NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);
let slideFactor : CGFloat = 0.1 * slideMult; // Increase for more of a slide
var finalPoint : CGPoint = CGPointMake(panGest.view!.center.x + (velocity.x * slideFactor),
panGest.view!.center.y + (velocity.y * slideFactor));
finalPoint.x = min(max(finalPoint.x, 0), self.view.bounds.size.width);
finalPoint.y = min(max(finalPoint.y, 0), self.view.bounds.size.height);
UIView.animateWithDuration(Double(slideFactor*2), delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
panGest.view!.center = finalPoint;
}, completion: nil)
}
몇 년 후에 내 모자를 링에 던져 넣었습니다.
영상 보기의 시작 중심을 저장해야 합니다.
var panBegin: CGPoint.zero
그런 다음 변환을 사용하여 새 센터를 업데이트합니다.
if recognizer.state == .began {
panBegin = imageView!.center
} else if recognizer.state == .ended {
panBegin = CGPoint.zero
} else if recognizer.state == .changed {
let translation = recognizer.translation(in: view)
let panOffsetTransform = CGAffineTransform( translationX: translation.x, y: translation.y)
imageView!.center = panBegin.applying(panOffsetTransform)
}
추가로, 저는 이것에 많은 시간을 소비하기 때문에: 저의 관점 (제가 적용한)addGestureRecognizer
on)이 동적으로 생성되었으므로 수정해야 했습니다.userInteractionEnabled
로.true
Swift 2 버전:
// start detecting pan gesture
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(TTAltimeterDetailViewController.panGestureDetected(_:)))
panGestureRecognizer.minimumNumberOfTouches = 1
self.chartOverlayView.addGestureRecognizer(panGestureRecognizer)
func panGestureDetected(panGestureRecognizer: UIPanGestureRecognizer) {
print("pan gesture recognized")
}
언급URL : https://stackoverflow.com/questions/6672677/how-to-use-uipangesturerecognizer-to-move-object-iphone-ipad
'programing' 카테고리의 다른 글
PowerShell에서 SQL Server 데이터베이스에 연결 (0) | 2023.07.30 |
---|---|
SQL의 다대다 가입 (0) | 2023.07.30 |
웹 응용 프로그램 빌드 오류:CodeDom 공급자 유형은 Microsoft입니다.비주얼 C.CppCodeProvider를 찾을 수 없습니다. (0) | 2023.07.30 |
오라클에서 숫자 형식의 최대값은 얼마입니까? (0) | 2023.07.30 |
Android 앱이 제거했다가 다시 설치한 후 데이터를 기억합니다. (0) | 2023.07.30 |