2011-03-22 7 views
2

내 애플 리케이션에 음성 메모 구성 요소가 있고 Mac OS에서 QuickTime X와 유사한 오디오를 자르도록 허용하고 싶습니다. 10 포인트 식스가 6 개를 처리하거나 iPhone. 여기에 모두의 예는 다음과 같습니다iPhone 오디오 레코딩을

enter image description here enter image description here

어떤 도움에 감사드립니다.

+1

것은 AVMutableCompositionTrack removeTimeRange를 살펴 보자. –

+0

그게 근본적인 작업을 수행하는 데 사용하는 것이지만 실제 문제는 실제로 UI를 만드는 것입니다. 어쩌면 스틸 비디오로 변환하고 편집 한 다음 다시 변환하면 좋은 방법을 제공 할 수 있습니까? –

+0

커스텀 컨트롤에서 Core Graphics를 사용할 것입니다. 내가 잠시 후에 대답으로 사용한 예제 슬라이더를 게시했습니다. –

답변

3

나는 UI 프로그래머가 아닙니다. 이것은 사용자 정의 컨트롤을 작성하는 방법을 알아보기 위해 작성한 테스트입니다. 이 코드는 작동하지 않을 수도 있습니다. 나는 언젠가 그것을 만지지 않았다.

헤더

@interface SUIMaxSlider : UIControl { 
@private 
    float_t minimumValue; 
    float_t maximumValue; 
    float_t value; 
    CGPoint trackPoint; 

} 
@property (nonatomic, assign) float_t minimumValue, maximumValue; 
@property (nonatomic, assign) float_t value; 
@end 

구현

#import "SUIMaxSlider.h" 
#import <CoreGraphics/CoreGraphics.h> 
#import <QuartzCore/QuartzCore.h> 
//#import "Common.h" 

#define kSliderPadding 5 

@implementation SUIMaxSlider 

@synthesize minimumValue, maximumValue; 

#pragma mark - 
#pragma mark Interface Initialization 

- (id) initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     trackPoint.x = self.bounds.size.width; 
     self.backgroundColor = [UIColor colorWithRed:135.0/255.0 green:173.0/255.0 blue:255.0/255.0 alpha:0.0]; 
    } 
    return self; 
} 

- (id) initWithFrame: (CGRect) aFrame { 
    if (self = [super initWithFrame:aFrame]) { 
     self.frame = aFrame; 
     self.bounds = aFrame; 
     self.center = CGPointMake(CGRectGetMidX(aFrame), CGRectGetMidY(aFrame)); 
     trackPoint.x = aFrame.size.width; 
    } 

    return self; 
} 

- (id) init { 
    return [self initWithFrame:CGRectZero]; 
} 

#pragma mark - 
#pragma mark Properties. 
#pragma mark - 

- (float_t) value { 
    return value; 
} 

- (void) setValue:(float_t) v { 
    value = fmin(v, maximumValue); 
    value = fmax(value, minimumValue); 
    float_t delta = maximumValue - minimumValue; 
    float_t scalar = ((self.bounds.size.width - 2 * kSliderPadding)/delta) ; 

    float_t x = (value - minimumValue) * scalar; 
    x += 5.0; 
    trackPoint.x = x; 

    [self setNeedsDisplay]; 
} 


#pragma mark - 
#pragma mark Interface Drawing 
#pragma mark - 

- (void) drawRect:(CGRect) rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGColorRef lightBlue = [UIColor colorWithRed:135.0/255.0 green:173.0/255.0 blue:255.0/255.0 alpha:1.0].CGColor; 
    CGColorRef lightBlueAlpha = [UIColor colorWithRed:135.0/255.0 green:173.0/255.0 blue:255.0/255.0 alpha:0.7].CGColor; 
    CGColorRef lightGrayColor = [UIColor colorWithRed:130.0/255.0 green:130.0/255.0 blue:130.0/255.0 alpha:1.0].CGColor; 
    CGColorRef darkGrayColor = [UIColor colorWithRed:70.0/255.0 green:70.0/255.0 blue:70.0/255.0 alpha:1.0].CGColor; 
    CGColorRef redColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.6].CGColor; 

    CGRect boundsRect = self.bounds; 

    CGRect sliderRect = CGRectMake(0, 0, boundsRect.size.width, boundsRect.size.height/2); 

    /* 
    CGContextSetFillColorWithColor(context, lightGrayColor); 
    CGContextFillRect(context, sliderRect); 

    halfHeight.origin.y = sliderRect.size.height; 
    CGContextSetFillColorWithColor(context, darkGrayColor); 
    CGContextFillRect(context, sliderRect); 
    */ 

    CGFloat tx = fmin(sliderRect.size.width - kSliderPadding, trackPoint.x); 
    tx = fmax(kSliderPadding, tx); 

    sliderRect.origin.y = boundsRect.origin.y; 
    sliderRect.size.width = tx ; 
    CGContextSetFillColorWithColor(context, lightBlueAlpha); 
    CGContextFillRect(context, sliderRect); 

    sliderRect.origin.y = sliderRect.size.height; 
    CGContextSetFillColorWithColor(context, lightBlue); 
    CGContextFillRect(context, sliderRect); 


    CGFloat mid = boundsRect.size.height/2 ; 

    CGPoint a = CGPointMake(tx - kSliderPadding, mid); 
    CGPoint b = CGPointMake(tx, mid - kSliderPadding); 
    CGPoint c = CGPointMake(tx + kSliderPadding, mid); 
    CGPoint d = CGPointMake(tx, mid + kSliderPadding); 

    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, a.x, a.y); 
    CGContextAddLineToPoint(context, b.x, b.y); 
    CGContextAddLineToPoint(context, c.x, c.y); 
    CGContextAddLineToPoint(context, d.x, d.y); 
    CGContextAddLineToPoint(context, a.x, a.y); 

    CGContextFillPath(context); 
} 


#pragma mark - 
#pragma mark Touch Tracking 
#pragma mark - 

- (void) trackTouch:(UITouch *) touch { 
    CGPoint p = [touch locationInView:self]; 
    //bound track point 
    trackPoint.x = fmax(p.x, kSliderPadding) ; 
    trackPoint.x = fmin(trackPoint.x, self.bounds.size.width - kSliderPadding); 
    [self setNeedsDisplay]; 

    float_t x = trackPoint.x - kSliderPadding; 

    float_t delta = maximumValue - minimumValue; 
    float_t scalar = (x/(self.bounds.size.width - 2 * kSliderPadding)) ; 
    value = minimumValue + (delta * scalar); 
    [self sendActionsForControlEvents:UIControlEventValueChanged]; 

} 

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 
    [self trackTouch:touch]; 
} 

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 
    CGPoint p = [touch locationInView:self]; 

    trackPoint.x = fmax(p.x, kSliderPadding) ; 
    trackPoint.x = fmin(trackPoint.x, self.bounds.size.width - kSliderPadding); 
    [self setNeedsDisplay]; 

    return YES; 
} 

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { 
    [self trackTouch:touch]; 
    return YES; 
}  

@end 
+0

감사합니다. 원하는 UI를 제공하기 위해 확장하고 있습니다. –

+0

다행입니다. [Ray Wenderlich] (http://www.raywenderlich.com/tutorials)에는 핵심 그래픽과 사용자 정의 컨트롤을 사용하는 데 대한 몇 가지 유용한 입문서가 있습니다. –

관련 문제