ยกเลิกภาพเคลื่อนไหว UIView หรือไม่


244

เป็นไปได้ไหมที่จะยกเลิกUIViewภาพเคลื่อนไหวในขณะที่กำลังดำเนินการอยู่ หรือฉันต้องลงไปที่ระดับ CA?

นั่นคือฉันได้ทำบางสิ่งเช่นนี้แล้ว (อาจตั้งค่าแอนิเมชั่นสิ้นสุดด้วย):

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

แต่ก่อนที่อนิเมชั่นจะเสร็จสมบูรณ์และฉันได้รับอีเว้นท์สิ้นสุดของอนิเมชั่นฉันต้องการยกเลิก (ตัดให้สั้น) เป็นไปได้ไหม Googling around พบว่ามีเพียงไม่กี่คนที่ถามคำถามเดียวกันโดยไม่มีคำตอบและคนหนึ่งหรือสองคนที่คาดเดาว่าไม่สามารถทำได้


คุณหมายถึงหยุดภาพเคลื่อนไหวที่อยู่ตรงกลางแล้วปล่อยไว้ที่นั่นหรือไม่ หรือกลับไปที่จุดเริ่มต้น?
Chris Lundie

2
ไม่ว่าจะวางไว้ตรงไหนมันก็เป็นแอนิเมชั่นกลาง (ในทางปฏิบัติฉันจะเริ่มต้นแอนิเมชั่นอื่นต่อไป) หรือข้ามไปยังจุดสิ้นสุด ฉันคิดว่าอันแรกนั้นดูเป็นธรรมชาติมากกว่า แต่ก็ใช้ได้กับฉันด้วยในกรณีนี้
philsquared

3
@Chris Hanson: ฉันขอขอบคุณการแก้ไขของคุณ แต่สงสัยว่าเหตุผลของคุณคือการลบแท็ก iPhone มันอาจจะบอกเป็นนัย ๆ โดย cocoa-touch แต่สำหรับฉันมีตัวกรองแท็กบน iPhone และจะพลาดในกรณีนี้
philsquared

@Boot To The Head (อีกครั้ง): คำถามของคุณและการตอบสนองของฉันเองได้รับแจ้งให้ฉันทดสอบแยกอีกเล็กน้อยและฉันค้นพบว่าคุณเริ่มภาพเคลื่อนไหวใหม่ก่อนที่ภาพแรกเสร็จแล้วจะข้ามไปยังจุดสิ้นสุด ก่อนที่จะเริ่มใหม่
philsquared

- สิ่งนี้ตรงกับความต้องการเร่งด่วนของฉัน (และแนะนำว่าฉันมีข้อผิดพลาดอื่น ๆ ในรหัสจริงของฉัน) แต่ฉันจะปล่อยให้คำถามนี้เปิดเพราะฉันรู้ว่าคนอื่น ๆ ถามเหมือนกัน
philsquared

คำตอบ:


114

วิธีที่ฉันทำคือการสร้างภาพเคลื่อนไหวใหม่ไปยังจุดสิ้นสุดของคุณ กำหนดระยะเวลาที่สั้นมากและให้แน่ใจว่าคุณใช้+setAnimationBeginsFromCurrentState:วิธีการเพื่อเริ่มต้นจากสถานะปัจจุบัน เมื่อคุณตั้งค่าเป็น YES ภาพเคลื่อนไหวปัจจุบันจะถูกตัดสั้น ดูเหมือนว่านี้:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.1];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

ขอบคุณสตีเฟ่น อันที่จริงถ้าคุณอ่านความคิดเห็นภายใต้คำถามของฉันตรงนี้เป็นสิ่งที่ผมทำในที่สุด - แต่เนื่องจากคุณได้รับที่ดีชัดเจนของบัญชีได้ที่นี่ฉันทำเครื่องหมายว่ามันเป็นที่ยอมรับ
philsquared

1
@Vojto เป็นไงบ้าง? เอกสารกล่าวว่าการใช้งานsetAnimationBeginsFromCurrentState:นั้นไม่ได้รับการสนับสนุนจาก iOS 4 แต่ยังคงมีอยู่และควรใช้งานได้
Stephen Darlington

55
ใน iOS4 + ให้ใช้ตัวเลือก UIViewAnimationOptionBeginFromCurrentState ใน animateWithDuration: การหน่วงเวลา: ตัวเลือก: ภาพเคลื่อนไหว: เสร็จสิ้น:
Adam Eberbach

UIViewAnimationOptionBeginFromCurrentState จะยกเลิกภาพเคลื่อนไหวใด ๆ ที่กำลังดำเนินการอยู่หรือเป็นเพียงภาพเคลื่อนไหวที่กำหนดเป้าหมายไปที่คุณสมบัติเดียวกันหรือไม่ หากเป็นภาพเคลื่อนไหวใด ๆ คุณจะทำให้มันเป็นภาพเคลื่อนไหวใหม่ต่อไปที่จุดเดิมโดยไม่หยุดเคลื่อนไหวที่กำลังดำเนินอยู่
zakdances

1
@yourfriendzak ตามการทดสอบสั้น ๆ ดูเหมือนว่าจะยกเลิกเฉพาะภาพเคลื่อนไหวที่กำหนดเป้าหมายไปที่คุณสมบัติเดียวกัน ฉันพยายามเปลี่ยนอัลฟ่าของ scrollView ซึ่ง contentOffset เป็นภาพเคลื่อนไหวและภาพเคลื่อนไหว contentOffset ยังคงดำเนินต่อไป
arlomedia

360

ใช้:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];

22
ฉันพบว่าฉันต้องเพิ่ม#import <QuartzCore / QuartzCore.h>เพื่อลบคำเตือนคอมไพเลอร์;)
deanWombourne

4
เรียบง่ายและยังหายาก ขอบคุณสำหรับสิ่งนี้ฉันเพิ่งใช้เวลาชั่วโมงพยายามคิด
MikeyWard

4
ปัญหาที่เป็นไปได้ในการแก้ไขปัญหานี้คือ (อย่างน้อยใน iOS 5) มีความล่าช้าก่อนที่จะมีผล - มันไม่ทำงานเร็วพอถ้าสิ่งที่คุณหมายถึงคือ "หยุดภาพเคลื่อนไหวทันทีก่อนที่ฉันจะไปที่บรรทัดถัดไปของ รหัส".
แมตต์

14
ฉันพบว่าการเรียกสิ่งนี้ทำให้เกิดความสำเร็จ: ^ (BOOL เสร็จแล้ว) บล็อกหากใช้ + (void) animateWithDuration: (NSTimeInterval) การเคลื่อนไหวระยะเวลา: (void (^) (void)) การสร้างภาพเคลื่อนไหว: (void (^) (BOOL เสร็จ) ) เสร็จสิ้น
JWGS

1
@matt รู้วิธีแก้ปัญหาที่หยุดเคลื่อนไหวทันทีหรือไม่? ฉันกำลังสังเกตุความล่าช้าเล็กน้อยก่อนที่แอนิเมชันจะหยุดจริงๆ
tiguero

62

วิธีที่ง่ายที่สุดในการหยุดภาพเคลื่อนไหวทั้งหมดในมุมมองที่เฉพาะเจาะจงในทันทีคือ:

เชื่อมโยงโครงการกับ QuartzCore.framework ในตอนต้นของรหัสของคุณ:

#import <QuartzCore/QuartzCore.h>

ตอนนี้เมื่อคุณต้องการหยุดการเคลื่อนไหวทั้งหมดในมุมมองที่ตายในเพลงของพวกเขาให้พูดสิ่งนี้:

[CATransaction begin];
[theView.layer removeAllAnimations];
[CATransaction commit];

บรรทัดกลางจะทำงานได้เอง แต่มีความล่าช้าจนกว่า runloop จะเสร็จสิ้น ("ช่วงเวลาวาดใหม่") เพื่อป้องกันความล่าช้านั้นให้ตัดคำสั่งในบล็อกธุรกรรมที่ชัดเจนดังที่แสดง ผลงานนี้หากไม่มีการเปลี่ยนแปลงอื่น ๆ ในชั้นนี้ใน runloop ปัจจุบัน


2
ฉันใช้ [CATransaction flush] หลังจากโค้ดของคุณใช้งานได้ดีบางครั้งทำให้ไม่สามารถเขียนได้ทันที แต่อย่างไรก็ตามมีปัญหาประสิทธิภาพ 0.1 วินาทีเช่นมันล่าช้าในเวลานั้น วิธีแก้ปัญหาใด ๆ
Sidwyn Koh

5
removeAllAnimationsจะมีผลข้างเคียงของการนำภาพเคลื่อนไหวมาสู่เฟรมสุดท้ายแทนที่จะหยุดในที่ที่มันอยู่ตอนนี้
Ilya

3
โดยปกติเมื่อต้องการให้ภาพเคลื่อนไหวหยุดพวกเขาคาดหวังให้หยุดที่เฟรมปัจจุบัน - ไม่ใช่เฟรมแรกหรือเฟรมสุดท้าย การกระโดดไปที่เฟรมแรกหรือเฟรมสุดท้ายจะดูเหมือนการเคลื่อนไหวกระตุก
Ilya

1
ฉันจะให้รายละเอียดคำตอบเพื่อระบุว่าพฤติกรรมเริ่มต้นคืออะไรและสามารถเปลี่ยนแปลงได้อย่างไร เห็นได้ชัดว่ามีคนที่ทำแอนิเมชันสนใจอย่างแข็งขันในสิ่งที่เกิดขึ้นบนหน้าจอตามวิธีการของเขาเรียก :)
Ilya

1
ฉันมีรายละเอียดที่อื่น นั่นไม่ใช่สิ่งที่ถูกถามดังนั้นจึงไม่ใช่สิ่งที่ฉันตอบที่นี่ หากคุณมีคำตอบอีกคำตอบให้แน่นอน!
ด้าน

48

บน iOS 4 และสูงกว่าให้ใช้UIViewAnimationOptionBeginFromCurrentStateตัวเลือกในภาพเคลื่อนไหวที่สองเพื่อตัดภาพเคลื่อนไหวแรกสั้น ๆ

ตัวอย่างเช่นสมมติว่าคุณมีมุมมองพร้อมตัวบ่งชี้กิจกรรม คุณต้องการที่จะจางหายไปในตัวบ่งชี้กิจกรรมในขณะที่บางกิจกรรมอาจใช้เวลานานเริ่มต้นและจางหายไปเมื่อกิจกรรมเสร็จสิ้น activityViewในโค้ดข้างล่างนี้ดูกับตัวบ่งชี้กิจกรรมที่มันถูกเรียกว่า

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}

41

หากต้องการยกเลิกภาพเคลื่อนไหวคุณต้องตั้งค่าคุณสมบัติที่กำลังเคลื่อนไหวอยู่นอกภาพเคลื่อนไหว UIView นั่นจะหยุดภาพเคลื่อนไหวไม่ว่าจะอยู่ที่ไหนและ UIView จะข้ามไปยังการตั้งค่าที่คุณเพิ่งกำหนดไว้


9
นี่เป็นเพียงบางส่วนเท่านั้น มันหยุดแอนิเมชัน แต่มันไม่หยุดมันจากการยิงผู้ร่วมงานที่สะดุดตาที่สุดคือแอนิเมชั่นตัวจัดการที่สมบูรณ์ดังนั้นถ้าคุณมีตรรกะที่นั่นคุณจะเห็นปัญหา
เอ็มไรอัน

33
นั่นคือสิ่งที่อาร์กิวเมนต์ 'เสร็จสิ้น' -animationDidStop:finished:context:มีไว้สำหรับ ถ้า[finished boolValue] == NOคุณรู้ว่าภาพเคลื่อนไหวของคุณถูกยกเลิกอย่างใด
Nick Forge

นี่เป็นเคล็ดลับที่ยอดเยี่ยมจาก 7 ปีที่แล้ว! โปรดทราบว่ามีพฤติกรรมแปลก ๆ : สมมติว่าคุณเคลื่อนไหวแอลฟ่าไปข้างหน้าและข้างหน้าและทำให้มันเป็น "ไปที่ 0" ในการหยุดภาพเคลื่อนไหวคุณไม่สามารถตั้งค่าอัลฟาเป็นศูนย์ได้ คุณตั้งค่าให้บอกว่า 1
Fattie

26

ขออภัยที่จะรื้อฟื้นคำตอบนี้ใหม่ แต่ใน iOS 10 สิ่งที่เปลี่ยนไปและตอนนี้การยกเลิกเป็นไปได้และคุณสามารถยกเลิกได้อย่างงดงาม!

หลังจาก iOS 10 คุณสามารถยกเลิกภาพเคลื่อนไหวด้วยUIViewPropertyAnimator !

UIViewPropertyAnimator(duration: 2, dampingRatio: 0.4, animations: {
    view.backgroundColor = .blue
})
animator.stopAnimation(true)

หากคุณผ่านความจริงมันจะยกเลิกการเคลื่อนไหวและจะหยุดทันทีที่คุณยกเลิก วิธีการเสร็จสิ้นจะไม่ถูกเรียก อย่างไรก็ตามหากคุณผ่านการปลอมคุณจะต้องรับผิดชอบในการทำการ์ตูนให้เสร็จ:

animator.finishAnimation(.start)

คุณสามารถทำภาพเคลื่อนไหวให้เสร็จและอยู่ในสถานะปัจจุบัน (.current) หรือไปที่สถานะเริ่มต้น (.start) หรือไปยังสถานะสิ้นสุด (.end)

โดยวิธีการที่คุณสามารถหยุดและเริ่มในภายหลัง ...

animator.pauseAnimation()
animator.startAnimation()

หมายเหตุ: หากคุณไม่ต้องการยกเลิกอย่างฉับพลันคุณสามารถย้อนกลับภาพเคลื่อนไหวของคุณหรือแม้แต่เปลี่ยนภาพเคลื่อนไหวของคุณหลังจากที่คุณหยุดชั่วคราว!


2
นี่เป็นสิ่งที่เกี่ยวข้องกับภาพเคลื่อนไหวที่ทันสมัยที่สุดอย่างแน่นอน
Doug

10

หากคุณกำลังเคลื่อนไหวข้อ จำกัด โดยการเปลี่ยนค่าคงที่แทนคุณสมบัติมุมมองไม่มีวิธีอื่นใดที่ทำงานบน iOS 8

ตัวอย่างภาพเคลื่อนไหว:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

สารละลาย:

คุณต้องลบภาพเคลื่อนไหวออกจากเลเยอร์ของมุมมองใด ๆ ที่ได้รับผลกระทบจากการเปลี่ยนแปลงข้อ จำกัด และชั้นย่อย

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}

1
ใช้ได้เฉพาะself.constraintView.layer.removeAllAnimations()(สวิฟท์)
Lachtan

ไม่มีวิธีแก้ปัญหาอื่นที่ใช้ได้ขอบคุณสำหรับฉัน
swapnilagarwal


5

ไม่สามารถแก้ไขได้สำหรับฉัน แต่สิ่งนี้ช่วยได้: อUIViewนิเมชั่นตั้งค่าคุณสมบัติทันทีจากนั้นจึงเคลื่อนไหว มันหยุดการเคลื่อนไหวเมื่อเลเยอร์การนำเสนอตรงกับโมเดล (คุณสมบัติชุด)

ฉันแก้ไขปัญหาของฉันซึ่งก็คือ "ฉันต้องการเคลื่อนไหวจากที่ที่คุณดูเหมือนว่าคุณปรากฏ" ('คุณ' หมายถึงมุมมอง) หากคุณต้องการสิ่งนั้น

  1. เพิ่ม QuartzCore
  2. CALayer * pLayer = theView.layer.presentationLayer;

กำหนดตำแหน่งเป็นเลเยอร์การนำเสนอ

ฉันใช้ตัวเลือกสองสามอย่างรวมถึง UIViewAnimationOptionOverrideInheritedDuration

แต่เนื่องจากเอกสารของ Apple นั้นคลุมเครือฉันไม่รู้ว่าจริง ๆ แล้วมันแทนที่ภาพเคลื่อนไหวอื่น ๆ เมื่อใช้หรือรีเซ็ตตัวจับเวลา

[UIView animateWithDuration:blah... 
                    options: UIViewAnimationOptionBeginFromCurrentState ... 
                    animations: ^ {
                                   theView.center = CGPointMake( pLayer.position.x + YOUR_ANIMATION_OFFSET, pLayer.position.y + ANOTHER_ANIMATION_OFFSET);
                   //this only works for translating, but you get the idea if you wanna flip and scale it. 
                   } completion: ^(BOOL complete) {}];

และนั่นควรเป็นทางออกที่ดีสำหรับตอนนี้



2

วิธีการแก้ปัญหาของ Stephen Darlington รุ่นที่รวดเร็ว

UIView.beginAnimations(nil, context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(0.1)
// other animation properties

// set view properties
UIView.commitAnimations()

1

ผมมีปัญหาเดียวกัน; API ไม่มีสิ่งใดที่จะยกเลิกการเคลื่อนไหวบางอย่าง

+ (void)setAnimationsEnabled:(BOOL)enabled

ปิดใช้งานภาพเคลื่อนไหวทั้งหมดและจึงไม่ได้ผลสำหรับฉัน มีสองวิธีแก้ไข:

1) ทำให้วัตถุเคลื่อนไหวของคุณเป็นมุมมองย่อย จากนั้นเมื่อคุณต้องการยกเลิกภาพเคลื่อนไหวสำหรับมุมมองนั้นให้ลบมุมมองหรือซ่อน ง่ายมาก แต่คุณต้องสร้างมุมมองย่อยใหม่โดยไม่มีภาพเคลื่อนไหวหากคุณจำเป็นต้องเก็บมุมมองนั้นไว้

2) ทำซ้ำอนิเมเพียงครั้งเดียวและเลือกตัวแทนเพื่อรีสตาร์ทอนิเมถ้าจำเป็นเช่นนี้

-(void) startAnimation {
NSLog(@"startAnim alpha:%f", self.alpha);
[self setAlpha:1.0];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationRepeatCount:1];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(pulseAnimationDidStop:finished:context:)];
[self setAlpha:0.1];
[UIView commitAnimations];
}

- (void)pulseAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
if(hasFocus) {
    [self startAnimation];
} else {
    self.alpha = 1.0;
}
}

-(void) setHasFocus:(BOOL)_hasFocus {
hasFocus = _hasFocus;
if(hasFocus) {
    [self startAnimation];
}
}

ปัญหาเกี่ยวกับ 2) คือว่าจะมีการหยุดการหยุดเคลื่อนไหวเสมอเนื่องจากจะเสร็จสิ้นรอบการเคลื่อนไหวปัจจุบัน

หวังว่านี่จะช่วยได้


1

แม้ว่าคุณจะยกเลิกแอนิเมชั่นในรูปแบบข้างบนแอนิเมชั่นdidStopSelectorก็ยังคงทำงานอยู่ ดังนั้นหากคุณมีสถานะทางตรรกะในแอปพลิเคชันของคุณซึ่งขับเคลื่อนโดยแอนิเมชั่นคุณจะมีปัญหา ด้วยเหตุนี้ด้วยวิธีที่อธิบายไว้ข้างต้นฉันใช้ตัวแปรบริบทของUIViewภาพเคลื่อนไหว หากคุณผ่านสถานะปัจจุบันของโปรแกรมของคุณโดยพารามิเตอร์บริบทไปยังภาพเคลื่อนไหวเมื่อภาพเคลื่อนไหวหยุดการdidStopSelectorทำงานของคุณอาจตัดสินใจได้ว่าควรจะทำอะไรหรือเพียงแค่กลับมาขึ้นอยู่กับสถานะปัจจุบันและค่าสถานะที่ส่งเป็นบริบท


NickForge อธิบายสิ่งนี้อย่างสมบูรณ์แบบในความคิดเห็นด้านล่างคำตอบที่ถูกต้องของ TomTaylor ด้านบน ...
Fattie

ขอบคุณมากสำหรับบันทึกนี้! แน่นอนฉันมีสถานการณ์เช่นนี้ที่ภาพเคลื่อนไหวต่อไปถูกไล่ออกเมื่อเรียกว่า animationDidStop หากคุณเพียงแค่ลบภาพเคลื่อนไหวและเพิ่มใหม่ทันทีสำหรับคีย์เดียวกันฉันพบว่ามันจะไม่ทำงาน คุณต้องรอตัวอย่างเช่นจนถึง animationDidStop ทริกเกอร์สำหรับภาพเคลื่อนไหวอื่นหรืออย่างอื่น ภาพเคลื่อนไหวที่เพิ่งถูกลบออกจะไม่เริ่มเคลื่อนไหว animationDidStop อีกต่อไป
RickJansen


0

หากต้องการหยุดภาพเคลื่อนไหวชั่วคราวโดยไม่เปลี่ยนสถานะเป็นต้นฉบับหรือครั้งสุดท้าย:

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

0

เมื่อฉันทำงานกับUIStackViewแอนิเมชั่นนอกจากนี้removeAllAnimations()ฉันต้องตั้งค่าบางอย่างให้เป็นค่าเริ่มต้นเพราะremoveAllAnimations()สามารถตั้งค่าเป็นสถานะที่ไม่แน่นอน ฉันมีstackViewด้วยview1และview2ภายในและมุมมองหนึ่งควรจะมองเห็นและซ่อนอยู่:

public func configureStackView(hideView1: Bool, hideView2: Bool) {
    let oldHideView1 = view1.isHidden
    let oldHideView2 = view2.isHidden
    view1.layer.removeAllAnimations()
    view2.layer.removeAllAnimations()
    view.layer.removeAllAnimations()
    stackView.layer.removeAllAnimations()
    // after stopping animation the values are unpredictable, so set values to old
    view1.isHidden = oldHideView1 //    <- Solution is here
    view2.isHidden = oldHideView2 //    <- Solution is here

    UIView.animate(withDuration: 0.3,
                   delay: 0.0,
                   usingSpringWithDamping: 0.9,
                   initialSpringVelocity: 1,
                   options: [],
                   animations: {
                    view1.isHidden = hideView1
                    view2.isHidden = hideView2
                    stackView.layoutIfNeeded()
    },
                   completion: nil)
}

0

โซลูชันที่ได้รับคำตอบไม่เหมาะกับฉัน ฉันแก้ไขปัญหาของฉันด้วยวิธีนี้ (ฉันไม่ทราบว่าเป็นวิธีที่ถูกต้องหรือไม่) เนื่องจากฉันมีปัญหาในการโทรเร็วเกินไป (เมื่อภาพเคลื่อนไหวก่อนหน้านี้ยังไม่เสร็จสิ้น) ฉันส่งภาพเคลื่อนไหวที่ต้องการด้วยบล็อกcustomAnim

extension UIView
{

    func niceCustomTranstion(
        duration: CGFloat = 0.3,
        options: UIView.AnimationOptions = .transitionCrossDissolve,
        customAnim: @escaping () -> Void
        )
    {
        UIView.transition(
            with: self,
            duration: TimeInterval(duration),
            options: options,
            animations: {
                customAnim()
        },
            completion: { (finished) in
                if !finished
                {
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    self.layer.removeAllAnimations()
                    customAnim()
                }
        })

    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.