2012-08-10 28 views
6

मुझे कुछ कोड के साथ कुछ प्रदर्शन समस्याएं हैं जिन्हें मैंने स्पर्श का उपयोग करके कैलियर का आकार बदलने के लिए लिखा है। यह ठीक काम करता है लेकिन एनीमेशन काफी खुश है और स्पर्श स्थान के पीछे है।कैलियर का आकार धीमा है

CGPoint startPoint; 
CALayer *select; 

- (CGRect)rectPoint:(CGPoint)p1 toPoint:(CGPoint)p2 { 
    CGFloat x, y, w, h; 
    if (p1.x < p2.x) { 
     x = p1.x; 
     w = p2.x - p1.x; 
    } else { 
     x = p2.x; 
     w = p1.x - p2.x; 
    } 
    if (p1.y < p2.y) { 
     y = p1.y; 
     h = p2.y - p1.y; 
    } else { 
     y = p2.y; 
     h = p1.y - p2.y; 
    } 
    return CGRectMake(x, y, w, h); 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *t1 = [[[event allTouches]allObjects]objectAtIndex:0]; 
    CGPoint loc = [t1 locationInView:self]; 
    startPoint = loc; 
    lastPoint = CGPointMake(loc.x + 5, loc.y + 5); 

    select = [CALayer layer]; 
    select.backgroundColor = [[UIColor blackColor]CGColor]; 
    select.frame = CGRectMake(startPoint.x, startPoint.y, 5, 5); 
    [self.layer addSublayer:select]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *t1 = [[[event allTouches]allObjects]objectAtIndex:0]; 
    CGPoint loc = [t1 locationInView:self]; 
    select.bounds = [self rectPoint:startPoint toPoint:loc]; 
} 

क्या यह प्राप्त करने का एक बेहतर तरीका है?

उत्तर

24

अंतराल इसलिए है क्योंकि आप परत की bounds संपत्ति बदल रहे हैं, जो एक एनिमेटेबल संपत्ति है।

कैलियर के साथ (सीए मूल एनीमेशन के लिए खड़ा है ...) एक एनिमेटेबल संपत्ति में कोई भी बदलाव डिफ़ॉल्ट रूप से एनिमेटेड होगा। इसे निहित एनीमेशन कहा जाता है। डिफ़ॉल्ट एनीमेशन 0.25 सेकेंड लेता है, इसलिए यदि आप इसे बार-बार अपडेट कर रहे हैं, तो स्पर्शों की प्रसंस्करण के दौरान कहें, यह जोड़ देगा और दृश्यमान अंतराल का कारण बन जाएगा। स्विफ्ट 3/4 में

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
layer.bounds = whatever; 
[CATransaction commit]; 
+2

मुझे कम से कम एक दिन ले लिया होगा ताकि स्वतंत्र रूप से पता चल सके, धन्यवाद स्टैक + jrturton। –

1

स्वीकृत जवाब:

इसे रोकने के लिए, आप एक एनीमेशन लेन-देन, अंतर्निहित एनिमेशन बंद कर देते हैं घोषित करना चाहिए, तो गुणों को बदलने

CATransaction.begin() 
CATransaction.setDisableActions(true) 
layer.bounds = whatever 
CATransaction.commit() 

वर्थ कि उल्लेख यह .frame गुणों पर भी लागू होता है, उदाहरण के लिए जब आप AVPlayerLayer का आकार बदल रहे हैं:

override func layoutSubviews() { 
    CATransaction.begin() 
    CATransaction.setDisableActions(true) 
    playerLayer.frame = self.bounds 
    CATransaction.commit() 
}