ইউআইভিউভিউ অসীম 360 ডিগ্রি ঘূর্ণন অ্যানিমেশন?


251

আমি একটি ঘোরানোর চেষ্টা করছি UIImageView 360 ডিগ্রি এবং অনলাইনে বেশ কয়েকটি টিউটোরিয়াল দেখেছি। আমি তাদের UIViewকোনওটিই কাজ বন্ধ করতে পারিনি, হয় না থামিয়ে বা নতুন অবস্থানে ঝাঁপিয়ে পড়ে।

  • আমি কীভাবে এটি অর্জন করতে পারি?

সর্বশেষ জিনিসটি আমি চেষ্টা করেছি:

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:0
                 animations:^{
                     imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Done!");
                 }];

তবে আমি যদি 2 * পাই ব্যবহার করি তবে এটি মোটেও সরবে না (যেহেতু এটি একই অবস্থান)। যদি আমি কেবল পাই (180 ডিগ্রি) করার চেষ্টা করি তবে এটি কাজ করে, তবে আমি যদি আবার পদ্ধতিটি কল করি তবে এটি পিছন দিকে ঘুরবে।

সম্পাদনা :

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:0
                 animations:^{
                     [UIView setAnimationRepeatCount:HUGE_VALF];
                     [UIView setAnimationBeginsFromCurrentState:YES];
                     imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Done!");
                 }];

কাজ করে না। এটি 180ডিগ্রীতে যায় , দ্বিতীয় বিভাজনের জন্য বিরতি দেয় এবং 0আবার শুরু হওয়ার আগে আবার ডিগ্রীতে পুনরায় সেট করে ।

উত্তর:


334

এমন একটি পদ্ধতি খুঁজে পেয়েছি (আমি এটি কিছুটা সংশোধন করেছি) যা আমার জন্য পুরোপুরি কাজ করেছে: আইফোন ইউআইআইমেজভিউ রোটেশন

#import <QuartzCore/QuartzCore.h>

- (void) runSpinAnimationOnView:(UIView*)view duration:(CGFloat)duration rotations:(CGFloat)rotations repeat:(float)repeat {
    CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ];
    rotationAnimation.duration = duration;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = repeat ? HUGE_VALF : 0;

    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

25
# আমদানি <কোয়ার্টজকোর / কোয়ার্টজকোড়.ইল>
আলবিবি

3
কোয়ার্টজকোর.ফ্রেমওয়ার্ক প্রকল্প যুক্ত করুন
gjpc

9
এটি আইওএস 3.0.০ এবং এর নীচে সঠিক কোড তবে নতুন প্রোগ্রামার এবং নতুন প্রকল্পগুলির জন্য, অ্যাপল এখন ব্যবহারকারীদের ডক্সে এই পদ্ধতিগুলি থেকে দূরে সরিয়ে দেওয়ার পরামর্শ দেয় এবং @ নেট কোড ব্লক ভিত্তিক অ্যানিমেশনগুলি ব্যবহার করে যা অ্যাপল এখন পছন্দ করে
পলউডআইআইআইআই

1
@cvsguimaraes ডকটি থেকে: "সম্পত্তিটির পূর্ববর্তী পুনরাবৃত্ত চক্রের শেষে মান এবং বর্তমান পুনরাবৃত্ত চক্রের মান কিনা তা নির্ধারণ করে।"
smad 9

12
এটি কারওর পক্ষে সহায়তা করতে পারে, [দেখুন.layer অপসারণ AllAnimations]; প্রয়োজনে অ্যানিমেশন বন্ধ করতে।
অরুনিট

112

এই ধারণার জন্য তৃতীয় রিচার্ড জে রসকে কুদোস, কিন্তু আমি দেখতে পেয়েছি যে তাঁর কোডটি আমার যা প্রয়োজন তা ছিল না। optionsআমার বিশ্বাস, এর জন্য ডিফল্ট হ'ল আপনাকে দেওয়া UIViewAnimationOptionCurveEaseInOut, যা অবিচ্ছিন্ন অ্যানিমেশনে সঠিক দেখাচ্ছে না। এছাড়াও, আমি একটি চেক যোগ করেছি যাতে আমার প্রয়োজন সত্ত্বেও আমার অ্যানিমেশনটি বন্ধ করতে পারে যদি আমার প্রয়োজন হয় ( অসীম নয় , তবে অনির্দিষ্ট সময়ের জন্য), এবং প্রথম 90 ডিগ্রি চলাকালীন ত্বরণ র‌্যাম্পটি তৈরি করে এবং শেষ 90 ডিগ্রির মধ্যে হ্রাস পেতে পারে (একটি স্টপ অনুরোধ করার পরে):

// an ivar for your class:
BOOL animating;

- (void)spinWithOptions:(UIViewAnimationOptions)options {
   // this spin completes 360 degrees every 2 seconds
   [UIView animateWithDuration:0.5
                         delay:0
                       options:options
                    animations:^{
                       self.imageToMove.transform = CGAffineTransformRotate(imageToMove.transform, M_PI / 2);
                    }
                    completion:^(BOOL finished) {
                       if (finished) {
                          if (animating) {
                             // if flag still set, keep spinning with constant speed
                             [self spinWithOptions: UIViewAnimationOptionCurveLinear];
                          } else if (options != UIViewAnimationOptionCurveEaseOut) {
                             // one last spin, with deceleration
                             [self spinWithOptions: UIViewAnimationOptionCurveEaseOut];
                          }
                       }
                    }];
}

- (void)startSpin {
   if (!animating) {
      animating = YES;
      [self spinWithOptions: UIViewAnimationOptionCurveEaseIn];
   }
}

- (void)stopSpin {
    // set the flag to stop spinning after one last 90 degree increment
    animating = NO;
}

হালনাগাদ

আমি আবার স্পিনিং শুরু করার জন্য অনুরোধগুলি হ্যান্ডেল করার ক্ষমতা যুক্ত করেছি ( startSpin), যখন আগের স্পিনটি ডাউন হয়ে যাচ্ছে (সমাপ্ত হচ্ছে)। গিথুবে এখানে নমুনা প্রকল্প ।


2
এটি ব্যবহার করে, আমি প্রতিটি পিআই / ২ কোণে (90 ডিগ্রি) অ্যানিমেশনে একটি সংক্ষিপ্ত বিরতি এবং সিএবিসিক অ্যানিমেশন ব্যবহার করে বাছাই করা উত্তরের উপরে সিপিইউ ব্যবহারে প্রান্তিক বৃদ্ধি লক্ষ্য করি। CabasicAnimation পদ্ধতিটি নির্বিঘ্নে মসৃণ অ্যানিমেশন তৈরি করে।
অর্জুন মেহতা

1
@Dilip, প্রতিস্থাপন M_PI / 2সঙ্গে - (M_PI / 2)। (প্রতিটি লাইনের শেষ দেখতে ডানদিকে কোডটি স্ক্রোল করুন)
নট

1
@ দিলিপ, আমি জানি না আপনি কী কোডটি আপনার কোডটিতে ব্যবহার করছেন। 0.5আমি যেমন 90 ডিগ্রি তে একই সেকেন্ড? যদি তা হয় তবে আমার কোড আপনাকে 90 ডিগ্রি ঘোরার ভগ্নাংশে থামতে দেয় না । এটি আপনাকে 90 ডিগ্রি বিরতিতে পুরো সংখ্যায় থামতে দেয়, তবে একটি অতিরিক্ত 90 ডিগ্রি ঘূর্ণন যোগ করে, "সহজ হয়ে যায়"। সুতরাং, উপরের stopSpinকোডটিতে , আপনি যদি 0.35 সেকেন্ডের পরে কল করেন তবে এটি আরও 0.65 সেকেন্ডের জন্য স্পিন করবে এবং 180 ডিগ্রি মোট আবর্তনে থামবে। আপনার আরও বিশদ প্রশ্ন থাকলে আপনার সম্ভবত একটি নতুন প্রশ্ন খোলার উচিত। এই উত্তরের সাথে লিঙ্ক নির্দ্বিধায়।
নোট 'ই

1
আপনি কি ঘটতে দেখছেন, মোহিতজেঠওয়া? আমার কাছে এমন একটি অ্যাপ রয়েছে যা এটি ব্যবহার করে এবং এটি এখনও আইওএস 8.1 এ আমার জন্য কাজ করে।
Nate

1
@ হেমং, নিশ্চিত, তবে এই প্রশ্নটি কী তা নয়। আপনি যদি এটি করার চেষ্টা করছেন তবে আমি একটি নতুন প্রশ্ন পোস্ট করব।
Nate

85

সুইফটে, আপনি অসীম ঘোরার জন্য নিম্নলিখিত কোডগুলি ব্যবহার করতে পারেন:

সুইফট 4

extension UIView {
    private static let kRotationAnimationKey = "rotationanimationkey"

    func rotate(duration: Double = 1) {
        if layer.animation(forKey: UIView.kRotationAnimationKey) == nil {
            let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")

            rotationAnimation.fromValue = 0.0
            rotationAnimation.toValue = Float.pi * 2.0
            rotationAnimation.duration = duration
            rotationAnimation.repeatCount = Float.infinity

            layer.add(rotationAnimation, forKey: UIView.kRotationAnimationKey)
        }
    }

    func stopRotating() {
        if layer.animation(forKey: UIView.kRotationAnimationKey) != nil {
            layer.removeAnimation(forKey: UIView.kRotationAnimationKey)
        }
    }
}

সুইফট 3

let kRotationAnimationKey = "com.myapplication.rotationanimationkey" // Any key

func rotateView(view: UIView, duration: Double = 1) {
    if view.layer.animationForKey(kRotationAnimationKey) == nil {
        let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")

        rotationAnimation.fromValue = 0.0
        rotationAnimation.toValue = Float(M_PI * 2.0)
        rotationAnimation.duration = duration
        rotationAnimation.repeatCount = Float.infinity

        view.layer.addAnimation(rotationAnimation, forKey: kRotationAnimationKey)
    }
}

থামার মতো:

func stopRotatingView(view: UIView) {
    if view.layer.animationForKey(kRotationAnimationKey) != nil {
        view.layer.removeAnimationForKey(kRotationAnimationKey)
    }
}

কে রোটেশনএনিমেশনকি কী?
লুদা

এটি একটি ধ্রুব স্ট্রিং কী, এটি আপনাকে অ্যানিমেশন সনাক্ত এবং অনুসন্ধানে সহায়তা করে। এটি আপনার যে কোনও স্ট্রিং হতে পারে। অপসারণ প্রক্রিয়ায়, আপনি দেখতে পারেন যে অ্যানিমেশনটি অনুসন্ধান করা হয়েছে এবং এই কী দ্বারা মুছে ফেলার চেয়ে বেশি।
Kedi

এটি কোন স্ট্রিং বা নির্দিষ্ট কিছু?
লুদা

দেরিতে উত্তরের জন্য দুঃখিত, তবে হ্যাঁ, এটি কোনও স্ট্রিং হতে পারে।
Kádi

1
// উত্তরের মতো কোনও কী
জেন্ডার জাং

67

উপরের নেটের উত্তর অ্যানিমেশন থামানো এবং শুরু করার জন্য আদর্শ এবং এটি আরও ভাল নিয়ন্ত্রণ দেয়। আমি আগ্রহী ছিলাম কেন আপনার কাজ হয়নি এবং তার কাজ করে না। আমি এখানে আমার অনুসন্ধানগুলি এবং কোডটির একটি সহজ সংস্করণ ভাগ করতে চেয়েছিলাম যা কোনও ইউআইভিউউকে স্টল না করেই অবিচ্ছিন্ন করে তুলবে।

এই কোডটি আমি ব্যবহার করেছি,

- (void)rotateImageView
{
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        [self.imageView setTransform:CGAffineTransformRotate(self.imageView.transform, M_PI_2)];
    }completion:^(BOOL finished){
        if (finished) {
            [self rotateImageView];
        }
    }];
}

আমি 'সিজিএফাইনট্রান্সফর্মমেকট্রোটেশন' এর পরিবর্তে 'সিজিএফাইনট্রান্সফর্মটোট' ব্যবহার করেছি কারণ পূর্ববর্তী ফলাফলটি অ্যানিমেশন এগিয়ে যাওয়ার সাথে সাথে সংরক্ষণ করা হয় returns এটি অ্যানিমেশন চলাকালীন দৃশ্যটির জাম্পিং বা পুনরায় সেট করা রোধ করবে।

আর একটি বিষয় 'ইউআইভিউএনিমেশনঅপশন রিপিট' ব্যবহার করা উচিত নয় কারণ অ্যানিমেশনটির পুনরাবৃত্তি শুরু করার আগে এটি পুনরায় পুনরুদ্ধার করে ভিউটিকে তার মূল অবস্থানে ফিরে আসে। পুনরাবৃত্তির পরিবর্তে, আপনি পুনরাবৃত্তি করেন যাতে রূপান্তরটি কখনই মূল মানটিতে পুনরায় সেট না হয় কারণ অ্যানিমেশন ব্লক কার্যত কখনও শেষ হয় না।

এবং শেষ কথাটি হ'ল, আপনাকে 360 বা 180 ডিগ্রি (2 * এমএপিআই বা এমএপিআই) এর পরিবর্তে 90 ডিগ্রি (এমএপিআই / 2) ধাপে ভিউটি রূপান্তর করতে হবে। কারণ রূপান্তরটি সাইন এবং কোসাইন মানের মানের ম্যাট্রিক্স গুণ হিসাবে ঘটে।

t' =  [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t

সুতরাং, বলুন আপনি 180 ডিগ্রি রূপান্তর ব্যবহার করেন, 180 ফলন -1 এর কোসাইন ভিউকে প্রতিবার বিপরীত দিকে রূপান্তরিত করে তোলে (নোট-নেটের জবাবটিতেও এই সমস্যাটি থাকবে যদি আপনি এমএফআইতে রূপান্তরের রেডিয়ান মান পরিবর্তন করেন)। একটি 360-ডিগ্রি রূপান্তরটি ভিউটি যেখানে ছিল সেখানে থাকার জন্য জিজ্ঞাসা করছে, অতএব আপনি কোনও ঘূর্ণন দেখবেন না।


আমার উত্তরটির পুরো পয়েন্টটি (এবং এটি থেকে প্রাপ্ত রিচার্ডের উত্তর) হ'ল দিকনির্দেশগুলি এড়ানোর জন্য 90 ডিগ্রি পদক্ষেপ ব্যবহার করা । 90 ডিগ্রি এছাড়াও তুলনামূলকভাবে ভাল কাজ করে যদি আপনি কখনও আবর্তন বন্ধ করতে চান না , যেহেতু অনেকগুলি চিত্রের মধ্যে 180 ডিগ্রি বা 90 ডিগ্রির প্রতিসাম্য রয়েছে।
নাট

হ্যাঁ, আমি কেবল ভেবেছিলাম কেন এটি ব্যবহার করা হচ্ছে তা ব্যাখ্যা করব :)
রাম

2
@ এনিক তবে সেখানে ব্রেকআপপয়েন্ট স্থাপনের পরে আমি দেখতে পাচ্ছি যে স্ট্যাক ওভারফ্লো হবে না কারণ ততক্ষণে সিস্টেমের দ্বারা সমাপ্তি ব্লক বলা হয়ে থাকে, rotateImageViewইতিমধ্যে ইতিমধ্যে শেষ হয়ে গেছে। সুতরাং এটি যে অর্থে সত্যই পুনরাবৃত্তি হয় না।
হুগি

1
পছন্দসই কার্যকারিতা সহ কোডের একটি ছোট সংস্করণের জন্য ভাল উত্তর +1।
প্রদীপ মিত্তাল

1
ইউআইভিউএনিমেশনঅশনেশন রিপিট কেন ব্যবহার করবেন না তার ব্যাখ্যাটি আমি সত্যিই প্রশংসা করেছি।
জোনাথন ঝাঁ

21

যদি আপনি যা করতে চান তা হ'ল চিত্রটি অবিরামভাবে ঘোরানো হয়, এটি বেশ ভালভাবে কাজ করে এবং খুব সাধারণ:

NSTimeInterval duration = 10.0f;
CGFloat angle = M_PI / 2.0f;
CGAffineTransform rotateTransform = CGAffineTransformRotate(imageView.transform, angle);

[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionRepeat| UIViewAnimationOptionCurveLinear animations:^{
    imageView.transform = rotateTransform;
} completion:nil];

আমার অভিজ্ঞতায়, এটি ত্রুটিহীনভাবে কাজ করে তবে নিশ্চিত হয়ে নিন যে আপনার চিত্রটি কোনও অফসেট ছাড়াই তার কেন্দ্রের চারদিকে ঘোরানো সক্ষম, অথবা চিত্রের অ্যানিমেশনটি একবার এটি পিআইয়ের চারপাশে পরিণত করার পরে "লাফিয়ে" যাবে।

স্পিনের দিক পরিবর্তন করতে angle( angle *= -1) এর সাইন পরিবর্তন করুন ।

@ অ্যালেক্সপ্রেটজ্লাভ দ্বারা মন্তব্যগুলি আপডেট করে আমাকে এটি পুনরায় দেখাতে বাধ্য করল এবং আমি বুঝতে পেরেছিলাম যে আমি যখন এই চিত্রটি লিখছিলাম তখন আমি উলম্ব এবং অনুভূমিক উভয় অক্ষের সাথেই মিরর করা হয়েছিল যার অর্থ চিত্রটি কেবলমাত্র 90 ডিগ্রি ঘোরানো হয়েছিল এবং তারপরে পুনরায় সেট করা হচ্ছে, যদিও এটি দেখতে মনে হচ্ছে এটি চারদিকে ঘোরানো অবিরত ছিল।

সুতরাং, আপনার চিত্রটি যদি আমার মতো হয় তবে এটি দুর্দান্ত কাজ করবে, তবে চিত্রটি যদি প্রতিসম নয়, আপনি 90 ডিগ্রির পরে মূল চিত্রটি "স্ন্যাপ" দেখতে পাবেন back

অ-প্রতিসাম্য চিত্রটি ঘোরানোর জন্য, আপনি গৃহীত উত্তরের সাথে আরও ভাল।

নীচে প্রদর্শিত এই কম মার্জিত সমাধানগুলির মধ্যে একটি চিত্রটি সত্যিকার অর্থে ঘোরানো হবে, তবে অ্যানিমেশনটি পুনরায় চালু করার সাথে একটি লক্ষণীয় স্টাটার থাকতে পারে:

- (void)spin
{
    NSTimeInterval duration = 0.5f;
    CGFloat angle = M_PI_2;
    CGAffineTransform rotateTransform = CGAffineTransformRotate(self.imageView.transform, angle);

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.imageView.transform = rotateTransform;
    } completion:^(BOOL finished) {
        [self spin];
    }];
}

@ রিচার্ড-জে-রস-আইআইআই পরামর্শ হিসাবে আপনি কেবল ব্লকগুলি দিয়েও এটি করতে পেরেছিলেন, তবে ব্লকটি নিজেকে ক্যাপচার করার কারণে আপনি একটি ধরে রাখা লুপ সতর্কতা পাবেন:

__block void(^spin)() = ^{
    NSTimeInterval duration = 0.5f;
    CGFloat angle = M_PI_2;
    CGAffineTransform rotateTransform = CGAffineTransformRotate(self.imageView.transform, angle);

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.imageView.transform = rotateTransform;
    } completion:^(BOOL finished) {
        spin();
    }];
};
spin();

1
এটি আমার জন্য কেবল একটি ঘূর্ণনের 1/4 ঘুরেছে।
অ্যালেক্স প্রেতজেলাভ

@ অ্যালেক্সপ্রেটজ্লাভ UIViewAnimationOptionRepeatআপনার অ্যানিমেশনটি সেট করেছেন তা নিশ্চিত হন options
লেভিগ্রোকার

1
আমি এটি করেছি, এটি 45
rot

কেন এই "কাজ করেছে" সে সম্পর্কে নতুন তথ্যের সাথে আমার উত্তর আপডেট করেছেন
লেভিগ্রোকার

21

চেক করা সমাধান থেকে একটি সুইফট এক্সটেনশনের সাথে আমার অবদান:

সুইফট 4.0

extension UIView{
    func rotate() {
        let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.toValue = NSNumber(value: Double.pi * 2)
        rotation.duration = 1
        rotation.isCumulative = true
        rotation.repeatCount = Float.greatestFiniteMagnitude
        self.layer.add(rotation, forKey: "rotationAnimation")
    }
}

অবমানিত:

extension UIView{
    func rotate() {
        let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.toValue = NSNumber(double: M_PI * 2)
        rotation.duration = 1
        rotation.cumulative = true
        rotation.repeatCount = FLT_MAX
        self.layer.addAnimation(rotation, forKey: "rotationAnimation")
    }
}

পুনরাবৃত্ত গণনার জন্য, কেউ ব্যবহার করতে পারেন .infinity
মিঃ রজার্স

15

ডেভিড রিসানেকের দুর্দান্ত উত্তরটি সুইফট 4 এ আপডেট হয়েছে :

import UIKit

extension UIView {

        func startRotating(duration: CFTimeInterval = 3, repeatCount: Float = Float.infinity, clockwise: Bool = true) {

            if self.layer.animation(forKey: "transform.rotation.z") != nil {
                return
            }

            let animation = CABasicAnimation(keyPath: "transform.rotation.z")
            let direction = clockwise ? 1.0 : -1.0
            animation.toValue = NSNumber(value: .pi * 2 * direction)
            animation.duration = duration
            animation.isCumulative = true
            animation.repeatCount = repeatCount
            self.layer.add(animation, forKey:"transform.rotation.z")
        }

        func stopRotating() {

            self.layer.removeAnimation(forKey: "transform.rotation.z")

        }   

    }
}

আমার জন্য খুব ভাল কাজ করেছে (একটি ইউআইবাটনে)। ধন্যবাদ!
অগ্রিপা

আমি আপনার সরলতা পছন্দ করেছি
নিকোলাস

10

ত্রৈমাসিকের মোড় ব্যবহার করুন, এবং পালাটি ক্রমবর্ধমান করুন।

void (^block)() = ^{
    imageToMove.transform = CGAffineTransformRotate(imageToMove.transform, M_PI / 2);
}

void (^completion)(BOOL) = ^(BOOL finished){
    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:0
                     animations:block
                     completion:completion];
}

completion(YES);

আমি ব্লকগুলিতে খুব নতুন তবে এই পদ্ধতিটি ভুল "নূতন (^ কনট__স্ট্রং ()" প্রকারের 'শূন্য (^) (বিওএল)' পরামিতিতে প্রেরণকারী বেমানানকারী ব্লক পয়েন্টার প্রেরণ করে I আমি কোডে আমার ঘূর্ণন পদ্ধতি পরিবর্তন করার চেষ্টা করেছি আমার প্রশ্নে চিত্রটিওমোভ.টান্সফর্ম = সিজিএফাইন ট্রান্সফরম্যাট রোটেট (চিত্রটোকোমোভ.টান্সফর্ম, এমএপিআই / ২); আপনি ব্যবহার করেছেন এবং অ্যানিমেশনটিতে এখনও কিছুটা বিলম্ব রয়েছে, এবং পরবর্তী বারের আগে পুনরায় সেট করুন
ডেরেক

10

এটি আমার পক্ষে কাজ করছিল:

[UIView animateWithDuration:1.0
                animations:^
{
    self.imageView.transform = CGAffineTransformMakeRotation(M_PI);
    self.imageView.transform = CGAffineTransformMakeRotation(0);
}];

এটা অসীম সময়ের জন্য ঘটছে না!
জীবন

9

আমি এই সংগ্রহস্থলটিতে দুর্দান্ত কোড পেয়েছি ,

এখান থেকে কোডটি এখানে দেওয়া হয়েছে আমি আমার গতির প্রয়োজন অনুসারে ছোট পরিবর্তন করেছি :)

UIImageView + + Rotate.h

#import <Foundation/Foundation.h>

@interface UIImageView (Rotate)
- (void)rotate360WithDuration:(CGFloat)duration repeatCount:(float)repeatCount;
- (void)pauseAnimations;
- (void)resumeAnimations;
- (void)stopAllAnimations;
@end

UIImageView + + Rotate.m

#import <QuartzCore/QuartzCore.h>
#import "UIImageView+Rotate.h"

@implementation UIImageView (Rotate)

- (void)rotate360WithDuration:(CGFloat)duration repeatCount:(float)repeatCount
{

    CABasicAnimation *fullRotation;
    fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    fullRotation.fromValue = [NSNumber numberWithFloat:0];
    //fullRotation.toValue = [NSNumber numberWithFloat:(2*M_PI)];
    fullRotation.toValue = [NSNumber numberWithFloat:-(2*M_PI)]; // added this minus sign as i want to rotate it to anticlockwise
    fullRotation.duration = duration;
    fullRotation.speed = 2.0f;              // Changed rotation speed
    if (repeatCount == 0)
        fullRotation.repeatCount = MAXFLOAT;
    else
        fullRotation.repeatCount = repeatCount;

    [self.layer addAnimation:fullRotation forKey:@"360"];
}

//Not using this methods :)

- (void)stopAllAnimations
{

    [self.layer removeAllAnimations];
};

- (void)pauseAnimations
{

    [self pauseLayer:self.layer];
}

- (void)resumeAnimations
{

    [self resumeLayer:self.layer];
}

- (void)pauseLayer:(CALayer *)layer
{

    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

- (void)resumeLayer:(CALayer *)layer
{

    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}

@end

@ ব্র্যাডিক্যাল এমডি, ম্যাথ প্রোগ্রামিংয়ের মতো, আপনি একাধিক উপায়ে একই কাজ করতে পারেন। এর অর্থ এই নয় যে কেবল 1 টি উপায় সঠিক এবং অন্যটি নয়। হ্যাঁ প্রতিটি উপায়ে কিছু উপকারিতা এবং বিবাদ থাকতে পারে, তবে এর অর্থ এই নয় যে আপনি কারও প্রোগ্রামিং পদ্ধতির বিষয়ে প্রশ্ন করতে পারেন, আপনি এই পদ্ধতির জন্য কনস এবং আপনার পদ্ধতির পক্ষে পরামর্শ দিতে পারেন। এই মন্তব্যটি সত্যিই আপত্তিকর, এবং আপনার মত মন্তব্য মন্তব্য করা উচিত নয়।
দিলীপ

1
আমি দুঃখিত যে এটি আপনাকে ক্ষুব্ধ করেছে, তবে 2 * এমএপিআই লিখতে ((360 * এমএপিআই) / 180) এর তুলনায় উদ্দেশ্যমূলকভাবে আরও স্পষ্ট করা হয়, এবং পরবর্তীটি লেখার ফলে বিষয়টির বোঝার অভাব দেখা যায়।
BreadicalMD

1
@ ব্রিডিক্যাল এমডি কোনও উদ্বেগ নয়, তবে এটির ভাল পরামর্শ, আমি আমার কোড আপডেট করেছি। ধন্যবাদ।
দিলিপ

9

এখানে ইউআইভিউ এক্সটেনশান হিসাবে আমার দ্রুত সমাধান। এটি কোনও ইউআইআইমেজভিউতে কোনও ইউআইএসিটিভিটি ইন্ডিকেটর আচরণের অনুকরণ হিসাবে বিবেচিত হতে পারে।

import UIKit

extension UIView
{

    /**
    Starts rotating the view around Z axis.

    @param duration Duration of one full 360 degrees rotation. One second is default.
    @param repeatCount How many times the spin should be done. If not provided, the view will spin forever.
    @param clockwise Direction of the rotation. Default is clockwise (true).
     */
    func startZRotation(duration duration: CFTimeInterval = 1, repeatCount: Float = Float.infinity, clockwise: Bool = true)
    {
        if self.layer.animationForKey("transform.rotation.z") != nil {
            return
        }
        let animation = CABasicAnimation(keyPath: "transform.rotation.z")
        let direction = clockwise ? 1.0 : -1.0
        animation.toValue = NSNumber(double: M_PI * 2 * direction)
        animation.duration = duration
        animation.cumulative = true
        animation.repeatCount = repeatCount
        self.layer.addAnimation(animation, forKey:"transform.rotation.z")
    }


    /// Stop rotating the view around Z axis.
    func stopZRotation()
    {
        self.layer.removeAnimationForKey("transform.rotation.z")
    }

}

9

একটি সুইফট 3 সংস্করণ:

extension UIView {

    func startRotate() {
        let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.fromValue = 0
        rotation.toValue = NSNumber(value: M_PI * 2)
        rotation.duration = 2
        rotation.isCumulative = true
        rotation.repeatCount = FLT_MAX
        self.layer.add(rotation, forKey: "rotationAnimation")
    }

    func stopRotate() {
        self.layer.removeAnimation(forKey: "rotationAnimation")
    }
}

এবং কল মনে রাখবেন startRotateমধ্যে viewWillAppearনেই viewDidLoad


3

আপনি ইউআইভিউ এবং ব্লকগুলি ব্যবহার করে একই ধরণের অ্যানিমেশনও করতে পারেন। এখানে একটি শ্রেণিবদ্ধকরণ পদ্ধতি যা কোনও কোণ দ্বারা দর্শন ঘোরানো যায়।

- (void)rotationWithDuration:(NSTimeInterval)duration angle:(CGFloat)angle options:(UIViewAnimationOptions)options
{
    // Repeat a quarter rotation as many times as needed to complete the full rotation
    CGFloat sign = angle > 0 ? 1 : -1;
    __block NSUInteger numberRepeats = floorf(fabsf(angle) / M_PI_2);
    CGFloat quarterDuration = duration * M_PI_2 / fabs(angle);

    CGFloat lastRotation = angle - sign * numberRepeats * M_PI_2;
    CGFloat lastDuration = duration - quarterDuration * numberRepeats;

    __block UIViewAnimationOptions startOptions = UIViewAnimationOptionBeginFromCurrentState;
    UIViewAnimationOptions endOptions = UIViewAnimationOptionBeginFromCurrentState;

    if (options & UIViewAnimationOptionCurveEaseIn || options == UIViewAnimationOptionCurveEaseInOut) {
        startOptions |= UIViewAnimationOptionCurveEaseIn;
    } else {
        startOptions |= UIViewAnimationOptionCurveLinear;
    }

    if (options & UIViewAnimationOptionCurveEaseOut || options == UIViewAnimationOptionCurveEaseInOut) {
        endOptions |= UIViewAnimationOptionCurveEaseOut;
    } else {
        endOptions |= UIViewAnimationOptionCurveLinear;
    }

    void (^lastRotationBlock)(void) = ^ {
        [UIView animateWithDuration:lastDuration 
                              delay:0 
                            options:endOptions 
                         animations:^{
                             self.transform = CGAffineTransformRotate(self.transform, lastRotation);
                         } 
                         completion:^(BOOL finished) {
                             NSLog(@"Animation completed");   
                         }
         ];
    };

    if (numberRepeats) {
        __block void (^quarterSpinningBlock)(void) = ^{ 
            [UIView animateWithDuration:quarterDuration 
                                  delay:0 
                                options:startOptions 
                             animations:^{
                                 self.transform = CGAffineTransformRotate(self.transform, M_PI_2);
                                 numberRepeats--; 
                             } 
                             completion:^(BOOL finished) {
                                 if (numberRepeats > 0) {
                                     startOptions = UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveLinear;
                                     quarterSpinningBlock();
                                 } else {
                                     lastRotationBlock();
                                 }NSLog(@"Animation completed");   
                             }
             ];

        };

        quarterSpinningBlock();
    } else {
        lastRotationBlock();
    }
}

এই পদ্ধতিটি (সম্পূর্ণরূপে পুনরাবৃত্ত কল) দ্রুত পরিবর্তনকারী অ্যানিমেশনের সাথে কী ভালভাবে কাজ করবে? উদাহরণস্বরূপ, সময়কাল প্রায় হবে। 1/30 এর দশকে যাতে আমি বাস্তব সময়ে বস্তুর ঘূর্ণনের গতি সংশোধন করতে পারি, উদাহরণস্বরূপ স্পর্শগুলির প্রতিক্রিয়া?
অ্যালেক্সাইল

3

যদি কেউ নেটের সমাধানটি চেয়েছিলেন তবে দ্রুত in

class SomeClass: UIViewController {

    var animating : Bool = false
    @IBOutlet weak var activityIndicatorImage: UIImageView!

    func startSpinning() {
        if(!animating) {
            animating = true;
            spinWithOptions(UIViewAnimationOptions.CurveEaseIn);
        }
    }

    func stopSpinning() {
        animating = false
    }

    func spinWithOptions(options: UIViewAnimationOptions) {
        UIView.animateWithDuration(0.5, delay: 0.0, options: options, animations: { () -> Void in
            let val : CGFloat = CGFloat((M_PI / Double(2.0)));
            self.activityIndicatorImage.transform = CGAffineTransformRotate(self.activityIndicatorImage.transform,val)
        }) { (finished: Bool) -> Void in

            if(finished) {
                if(self.animating){
                    self.spinWithOptions(UIViewAnimationOptions.CurveLinear)
                } else if (options != UIViewAnimationOptions.CurveEaseOut) {
                    self.spinWithOptions(UIViewAnimationOptions.CurveEaseOut)
                }
            }

        }
    }

    override func viewDidLoad() {
        startSpinning()
    }
}

3

জ্যামারিন আইওএসের জন্য:

public static void RotateAnimation (this UIView view, float duration=1, float rotations=1, float repeat=int.MaxValue)
{
    var rotationAnimation = CABasicAnimation.FromKeyPath ("transform.rotation.z");
    rotationAnimation.To = new NSNumber (Math.PI * 2.0 /* full rotation*/ * 1 * 1);
    rotationAnimation.Duration = 1;
    rotationAnimation.Cumulative = true;
    rotationAnimation.RepeatCount = int.MaxValue;
    rotationAnimation.RemovedOnCompletion = false;
    view.Layer.AddAnimation (rotationAnimation, "rotationAnimation");
}

2

এভাবেই আমি 360 টি সঠিক দিকে ঘোরান।

[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionRepeat|UIViewAnimationOptionCurveLinear
                     animations:^{
                         [imageIndView setTransform:CGAffineTransformRotate([imageIndView transform], M_PI-0.00001f)];
                     } completion:nil];

2

অ্যানিমেশন তৈরি করুন

- (CABasicAnimation *)spinAnimationWithDuration:(CGFloat)duration clockwise:(BOOL)clockwise repeat:(BOOL)repeats
{
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    anim.toValue = clockwise ? @(M_PI * 2.0) : @(M_PI * -2.0);
    anim.duration = duration;
    anim.cumulative = YES;
    anim.repeatCount = repeats ? CGFLOAT_MAX : 0;
    return anim;
}

এটির মতো দর্শনে এটি যুক্ত করুন

CABasicAnimation *animation = [self spinAnimationWithDuration:1.0 clockwise:YES repeat:YES];
[self.spinningView.layer addAnimation:animation forKey:@"rotationAnimation"];

এই উত্তরটি কীভাবে আলাদা? আপনার বেশিরভাগ ফাংশন এখানে এবং সেখানে কিছু অবৈধ জিনিসপত্রের পরিবর্তে বস্তুগুলি ফেরত দেয় তবে আপনার কাছে ওয়েল ক্লিনার কোড থাকবে।


2

ইউআইভিউ সহ 360 ডিগ্রি অ্যানিমেশন সম্পাদন করার বিভিন্ন উপায় রয়েছে।

CabasicAnimation ব্যবহার করা

var rotationAnimation = CABasicAnimation()
rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z")
rotationAnimation.toValue = NSNumber(value: (Double.pi))
rotationAnimation.duration = 1.0
rotationAnimation.isCumulative = true
rotationAnimation.repeatCount = 100.0
view.layer.add(rotationAnimation, forKey: "rotationAnimation")


এখানে ইউআইভিউ-র জন্য একটি এক্সটেনশন ফাংশন যা ঘূর্ণন কার্যক্রম শুরু এবং বন্ধ করতে পরিচালনা করে:

extension UIView {

    // Start rotation
    func startRotation() {
        let rotation = CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.fromValue = 0
        rotation.toValue = NSNumber(value: Double.pi)
        rotation.duration = 1.0
        rotation.isCumulative = true
        rotation.repeatCount = FLT_MAX
        self.layer.add(rotation, forKey: "rotationAnimation")
    }

    // Stop rotation
    func stopRotation() {
        self.layer.removeAnimation(forKey: "rotationAnimation")
    }
}


এখন ইউআইভিউ.অ্যানিমেশন বন্ধ ব্যবহার করছে :

UIView.animate(withDuration: 0.5, animations: { 
      view.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi)) 
}) { (isAnimationComplete) in
    // Animation completed 
}

2

@ রামের উত্তর সত্যিই সহায়ক ছিল। উত্তরের একটি সুইফ্ট সংস্করণ এখানে।

সুইফট 2

private func rotateImageView() {

    UIView.animateWithDuration(1, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { () -> Void in
        self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, CGFloat(M_PI_2))
        }) { (finished) -> Void in
            if finished {
                self.rotateImageView()
            }
    }
}

সুইফ্ট 3,4,5

private func rotateImageView() {

    UIView.animate(withDuration: 1, delay: 0, options: UIView.AnimationOptions.curveLinear, animations: { () -> Void in
        self.imageView.transform = self.imageView.transform.rotated(by: .pi / 2)
    }) { (finished) -> Void in
        if finished {
            self.rotateImageView()
        }
    }
}

আমি কিভাবে ঘোরানো বন্ধ করতে পারি?
ব্যবহারকারী 2526811

1
কীভাবে আপনি একটি পতাকা লাগান? সুতরাং, অ্যানিমেশন বন্ধ করার জন্য আপনার কাছে একটি চমত্কার উপকরণ রয়েছে: var stop = false private func stopRotation() { stop = true } তারপরে, ভিতরে if finished {...}:if finished { if stop { return} self.rotateImageView() }
yoninja

ধন্যবাদ, আমিও ঠিক তাই করেছি। আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ.
ব্যবহারকারী 2526811

1

আমি একটি চকচকে অ্যানিমেশন কাঠামো তৈরি করেছি যা আপনাকে সময়ের স্বর বাঁচাতে পারে! এটি ব্যবহার করে এই অ্যানিমেশনটি খুব সহজেই তৈরি করা যেতে পারে:

private var endlessRotater: EndlessAnimator!
override func viewDidAppear(animated: Bool) 
{
    super.viewDidAppear(animated)
    let rotationAnimation = AdditiveRotateAnimator(M_PI).to(targetView).duration(2.0).baseAnimation(.CurveLinear)
    endlessRotater = EndlessAnimator(rotationAnimation)
    endlessRotater.animate()
}

এই অ্যানিমেশনটি কেবলমাত্র সেট করা বন্ধ nilকরতেendlessRotater

আপনি যদি আগ্রহী হন তবে দয়া করে একবার দেখুন: https://github.com/hip4yes/Anmatics



1

সুইফট 4.0

func rotateImageView()
{
    UIView.animate(withDuration: 0.3, delay: 0, options: .curveLinear, animations: {() -> Void in
        self.imageView.transform = self.imageView.transform.rotated(by: .pi / 2)
    }, completion: {(_ finished: Bool) -> Void in
        if finished {
            rotateImageView()
        }
    })
}

1

কীফ্রেম অ্যানিমেশনগুলি ব্যবহার করে সুইফট 5 ইউআইভিউ এক্সটেনশন

এই পদ্ধতির সাহায্যে আমাদের সরাসরি ইউআইভিউ.অ্যানিমেশনওশনস.রিপেট ব্যবহার করতে দেওয়া হয়

public extension UIView {

    func animateRotation(duration: TimeInterval, repeat: Bool, completion: ((Bool) -> ())?) {

        var options = UIView.KeyframeAnimationOptions(rawValue: UIView.AnimationOptions.curveLinear.rawValue)

        if `repeat` {
            options.insert(.repeat)
        }

        UIView.animateKeyframes(withDuration: duration, delay: 0, options: options, animations: {

            UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.25, animations: {
                self.transform = CGAffineTransform(rotationAngle: CGFloat.pi/2)
            })

            UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.25, animations: {
                self.transform = CGAffineTransform(rotationAngle: CGFloat.pi)
            })

            UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.25, animations: {
                self.transform = CGAffineTransform(rotationAngle: 3*CGFloat.pi/2)
            })

            UIView.addKeyframe(withRelativeStartTime: 0.75, relativeDuration: 0.25, animations: {
                self.transform = CGAffineTransform(rotationAngle: 2*CGFloat.pi)
            })

        }, completion: completion)

    }

}

1
আমি আপনার পছন্দ করি, বেশ পরিষ্কারও
নিকোলাস

0

সুইফট:

func runSpinAnimationOnView(view:UIView , duration:Float, rotations:Double, repeatt:Float ) ->()
    {
        let rotationAnimation=CABasicAnimation();

        rotationAnimation.keyPath="transform.rotation.z"

        let toValue = M_PI * 2.0 * rotations ;


        // passing it a float
        let someInterval = CFTimeInterval(duration)

        rotationAnimation.toValue=toValue;
        rotationAnimation.duration=someInterval;
        rotationAnimation.cumulative=true;
        rotationAnimation.repeatCount=repeatt;
        view.layer.addAnimation(rotationAnimation, forKey: "rotationAnimation")


    }

0

সুইফট 3:

 var rotationAnimation = CABasicAnimation()
     rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z")
     rotationAnimation.toValue = NSNumber(value: (M_PI * 2.0))
     rotationAnimation.duration = 2.0
     rotationAnimation.isCumulative = true
     rotationAnimation.repeatCount = 10.0
     view.layer.add(rotationAnimation, forKey: "rotationAnimation")


-1

আমার মনে হয় আপনার আরও ভাল কোনও UIVIewবিভাগ যুক্ত করা উচিত :

#import <QuartzCore/QuartzCore.h>
#import "UIView+Rotate.h"

বাস্তবায়ন ইউআইভিউ (ঘোরান)

  • (void)remrotate360WithDuration:(CGFloat)duration repeatCount: (float)repeatCount
    {
        CABasicAnimation *fullRotation;
        fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
        fullRotation.fromValue = [NSNumber numberWithFloat:0];
        fullRotation.toValue = [NSNumber numberWithFloat:(2*M_PI)];
        // fullRotation.toValue = [NSNumber numberWithFloat:-(2*M_PI)]; // added this minus sign as i want to rotate it to anticlockwise
        fullRotation.duration = duration;
        fullRotation.speed = 2.0f; // Changed rotation speed
        if (repeatCount == 0)
            fullRotation.repeatCount = MAXFLOAT;
        else
            fullRotation.repeatCount = repeatCount;
    
        [self.layer addAnimation:fullRotation forKey:@"360"];
    }

এই পদ্ধতিগুলি ব্যবহার না করে :)

  • (void)remstopAllAnimations
    {
        [self.layer removeAllAnimations];
    };
  • (void)rempauseAnimations
    {
        [self rempauseLayer:self.layer];
    }
  • (void)remresumeAnimations
    {
        [self remresumeLayer:self.layer];
    }
  • (void)rempauseLayer:(CALayer *)layer
    {
        CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
        layer.speed = 0.0;
        layer.timeOffset = pausedTime;
    }
  • (void)remresumeLayer:(CALayer *)layer
    {
        CFTimeInterval pausedTime = [layer timeOffset];
        layer.speed = 1.0;
        layer.timeOffset = 0.0;
        layer.beginTime = 0.0;
        CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
        layer.beginTime = timeSincePause;
    }

সাবাশ. আমি কেবল ইউআইআইমেজভিউ বিভাগে মন্তব্য করতে চাই। আপনাকে সকল ধন্যবাদ।
Zgpeace
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.