| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- //
- // KSMergeAudioControlView.m
- // KulexiuSchoolStudent
- //
- // Created by 王智 on 2023/8/29.
- //
- #import "KSMergeAudioControlView.h"
- #import "UIView+KSCovertImage.h"
- #define MAX_OFFSET (600)
- @interface KSMergeAudioControlView ()
- @property (weak, nonatomic) IBOutlet UIView *bgView;
- @property (weak, nonatomic) IBOutlet UIView *sliderView;
- @property (weak, nonatomic) IBOutlet UIView *pointView;
- @property (weak, nonatomic) IBOutlet NSLayoutConstraint *pointLeft;
- @property (nonatomic, copy) MergeAudioAction callback;
- @property (nonatomic, assign) NSInteger recordVolume;
- @property (weak, nonatomic) IBOutlet UISlider *recordSlider;
- @property (nonatomic, assign) NSInteger bgVolume;
- @property (weak, nonatomic) IBOutlet UISlider *bgSlider;
- @property (nonatomic, assign) NSInteger offsetTime;
- @property (weak, nonatomic) IBOutlet UILabel *offsetTipsLabel;
- @property (weak, nonatomic) IBOutlet UIView *recordBubble;
- @property (weak, nonatomic) IBOutlet UILabel *recordBubbleLabel;
- @property (weak, nonatomic) IBOutlet UIView *recordGestureView;
- @property (weak, nonatomic) IBOutlet UIView *bgBubble;
- @property (weak, nonatomic) IBOutlet UILabel *bgVolumeBubble;
- @property (weak, nonatomic) IBOutlet UIView *bgGestureView;
- @property (weak, nonatomic) IBOutlet NSLayoutConstraint *recordCenterX;
- @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bgCenterX;
- @property (weak, nonatomic) IBOutlet UILabel *recordTitle;
- @property (weak, nonatomic) IBOutlet UIImageView *reRecordImage;
- @property (weak, nonatomic) IBOutlet NSLayoutConstraint *recordImgWidth;
- @property (weak, nonatomic) IBOutlet NSLayoutConstraint *recordImageRight;
- @property (weak, nonatomic) IBOutlet UIButton *recordButton;
- @end
- @implementation KSMergeAudioControlView
- - (void)awakeFromNib {
- [super awakeFromNib];
- self.bgView.layer.cornerRadius = 16;
- self.bgView.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMinXMaxYCorner;
- UIView *sliderImg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 12, 12)];
- sliderImg.layer.cornerRadius = 6.0f;
- sliderImg.layer.masksToBounds = YES;
- sliderImg.backgroundColor = THEMECOLOR;
- UIImage *image = [UIView convertViewToImage:sliderImg];
- [self.recordSlider setThumbImage:image forState:UIControlStateNormal];
- [self.recordSlider setThumbImage:image forState:UIControlStateHighlighted];
-
- [self.bgSlider setThumbImage:image forState:UIControlStateNormal];
- [self.bgSlider setThumbImage:image forState:UIControlStateHighlighted];
- [self configDefaultVolume];
-
- self.recordTitle.hidden = NO;
- self.reRecordImage.hidden = NO;
- self.recordImageRight.constant = 20.0f;
- self.recordImgWidth.constant = 24.0f;
- self.recordButton.userInteractionEnabled = YES;
- }
- - (void)configDefaultVolume {
- self.recordVolume = 100;
- self.recordSlider.value = self.recordVolume;
- self.bgVolume = 100;
- self.bgSlider.value = self.bgVolume;
- }
- - (void)configWithOffsetTime:(NSInteger)offsetTime {
- offsetTime = offsetTime / 10 * 10;
- self.offsetTime = offsetTime;
- }
- - (void)configRecordVolume:(NSInteger)recordVolume bgVolume:(NSInteger)bgVolume {
- self.recordVolume = recordVolume;
- self.recordSlider.value = recordVolume;
- self.bgVolume = bgVolume;
- self.bgSlider.value = bgVolume;
- // 处理数据
- self.recordBubbleLabel.text = [NSString stringWithFormat:@"%zd",bgVolume];
- self.recordCenterX.constant = 30 + ((recordVolume *1.0)/ 100)*237;
-
- self.bgVolumeBubble.text = [NSString stringWithFormat:@"%zd",bgVolume];
- self.bgCenterX.constant = 30 + ((bgVolume *1.0)/ 100)*237;
- }
- + (instancetype)shareIntance {
- KSMergeAudioControlView *view = [[[NSBundle mainBundle] loadNibNamed:@"KSMergeAudioControlView" owner:nil options:nil] firstObject];
- return view;
- }
- - (void)controlActionCallback:(MergeAudioAction)callback {
- if (callback) {
- self.callback = callback;
- }
- }
- #pragma mark ----- 音量控制
- - (void)configRecordVolumeValue:(NSInteger)volume {
- self.recordVolume = volume;
-
- self.recordBubbleLabel.text = [NSString stringWithFormat:@"%zd",volume];
- self.recordCenterX.constant = 30 + ((volume *1.0)/ 100)*237;
-
- [UIView animateWithDuration:0.1f animations:^{
- [self layoutIfNeeded];
- } completion:^(BOOL finished) {
- if (finished) {
- self.recordBubble.hidden = NO;
- }
- }];
- }
- - (void)configBgVolumeValue:(NSInteger)volume {
- self.bgVolume = volume;
- self.bgVolumeBubble.text = [NSString stringWithFormat:@"%zd",volume];
- self.bgCenterX.constant = 30 + ((volume *1.0)/ 100)*237;
- [UIView animateWithDuration:0.1f animations:^{
- [self layoutIfNeeded];
- } completion:^(BOOL finished) {
- if (finished) {
- self.bgBubble.hidden =NO;
- }
- }];
- }
- - (IBAction)cancleMerge:(id)sender {
- if (self.callback) {
- self.callback(MERGEACTION_CANCLE, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- }
- - (IBAction)saveFile:(id)sender {
- if (self.callback) {
- self.callback(MERGEACTION_SAVE, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- }
- - (IBAction)uploadFile:(id)sender {
- if (self.callback) {
- self.callback(MERGEACTION_UPLOAD, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- }
- - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
- if ([[(UITouch *)touches.anyObject view] isEqual:self.recordGestureView]) {
- self.recordBubble.hidden = NO;
- }
- else if ([[(UITouch *)touches.anyObject view] isEqual:self.bgGestureView]) {
- self.bgBubble.hidden = NO;
- }
- [super touchesBegan:touches withEvent:event];
- }
- - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
- [super touchesMoved:touches withEvent:event];
- if ([[(UITouch *)touches.anyObject view] isEqual:self.sliderView]) {
- CGPoint tempPoint = [touches.anyObject locationInView:self.sliderView];
- if (tempPoint.x <= 90.5) {
- NSInteger offset = (NSInteger)(tempPoint.x - 90.5) / 3 * 10 * 2;
- if (offset < -MAX_OFFSET) {
- offset = -MAX_OFFSET;
- }
- self.offsetTime = offset;
- }
- else if (tempPoint.x > 90.5) {
- NSInteger offset = (NSInteger)(tempPoint.x - 90.5) / 3 * 10 * 2;
- if (offset > MAX_OFFSET) {
- offset = MAX_OFFSET;
- }
- self.offsetTime = offset;
- }
- }
- else if ([[(UITouch *)touches.anyObject view] isEqual:self.recordGestureView]) {
- CGPoint tempPoint = [touches.anyObject locationInView:self.recordGestureView];
- CGFloat xPosition = tempPoint.x;
- CGFloat width = self.recordGestureView.frame.size.width;
- if (xPosition < 0) {
- xPosition = 0;
- }
- else if (xPosition > width) {
- xPosition = width;
- }
- NSInteger value = (xPosition / width) * 100;
- [self.recordSlider setValue:value animated:YES];
- [self configRecordVolumeValue:value];
- }
- else if ([[(UITouch *)touches.anyObject view] isEqual:self.bgGestureView]) {
- CGPoint tempPoint = [touches.anyObject locationInView:self.bgGestureView];
- CGFloat xPosition = tempPoint.x;
- CGFloat width = self.recordGestureView.frame.size.width;
- if (xPosition < 0) {
- xPosition = 0;
- }
- else if (xPosition > width) {
- xPosition = width;
- }
- NSInteger value = (xPosition / width) * 100;
- [self.bgSlider setValue:value animated:YES];
- [self configBgVolumeValue:value];
- }
- }
- - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
- [super touchesEnded:touches withEvent:event];
- if ([[(UITouch *)touches.anyObject view] isEqual:self.recordGestureView]) {
- CGPoint tempPoint = [touches.anyObject locationInView:self.recordGestureView];
- CGFloat xPosition = tempPoint.x;
- CGFloat width = self.recordGestureView.frame.size.width;
- if (xPosition < 0) {
- xPosition = 0;
- }
- else if (xPosition > width) {
- xPosition = width;
- }
- NSInteger value = (xPosition / width) * 100;
- [self refreshRecordValue:value];
- }
- else if ([[(UITouch *)touches.anyObject view] isEqual:self.bgGestureView]) {
-
- CGPoint tempPoint = [touches.anyObject locationInView:self.bgGestureView];
- CGFloat xPosition = tempPoint.x;
- CGFloat width = self.recordGestureView.frame.size.width;
- if (xPosition < 0) {
- xPosition = 0;
- }
- else if (xPosition > width) {
- xPosition = width;
- }
- NSInteger value = (xPosition / width) * 100;
- [self refreshBgValue:value];
-
- }
- else if ([[(UITouch *)touches.anyObject view] isEqual:self.sliderView]) {
- CGPoint tempPoint = [touches.anyObject locationInView:self.sliderView];
- if (tempPoint.x <= 90.5) {
- NSInteger offset = (NSInteger)(tempPoint.x - 90.5) / 3 * 10 * 2;
- if (offset < -MAX_OFFSET) {
- offset = -MAX_OFFSET;
- }
- self.offsetTime = offset;
- }
- else if (tempPoint.x > 90.5) {
- NSInteger offset = (NSInteger)(tempPoint.x - 90.5) / 3 * 10 * 2;
- if (offset > MAX_OFFSET) {
- offset = MAX_OFFSET;
- }
- self.offsetTime = offset;
- }
- NSLog(@"---- offset - %zd", self.offsetTime);
- if (self.callback) {
- self.callback(MERGEACTION_DELAY, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- }
- }
- - (void)refreshRecordValue:(NSInteger)value {
- NSLog(@"---- record volume ---- %zd", value);
- [self.recordSlider setValue:value animated:NO];
- [self configRecordVolumeValue:value];
- if (self.callback) {
- self.callback(MERGEACTION_MODIFY, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- @weakObj(self);
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
- @strongObj(self);
- self.recordBubble.hidden = YES;
- });
- }
- - (void)refreshBgValue:(NSInteger)value {
- NSLog(@"---- bg volume ---- %zd", value);
- [self.bgSlider setValue:value animated:NO];
- [self configBgVolumeValue:value];
- if (self.callback) {
- self.callback(MERGEACTION_MODIFY, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- @weakObj(self);
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
- @strongObj(self);
- self.bgBubble.hidden = YES;
- });
- }
- - (IBAction)leftAction:(id)sender {
- if (self.offsetTime <= -MAX_OFFSET) {
- self.offsetTime = -MAX_OFFSET;
- return;
- }
- self.offsetTime -= 10;
- if (self.callback) {
- self.callback(MERGEACTION_DELAY, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- }
- - (IBAction)rightAction:(id)sender {
- if (self.offsetTime >= MAX_OFFSET) {
- self.offsetTime = MAX_OFFSET;
- return;
- }
- self.offsetTime += 10;
- if (self.callback) {
- self.callback(MERGEACTION_DELAY, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- }
- - (IBAction)hideAction:(id)sender {
- if (self.callback) {
- self.callback(MERGEACTION_HIDEVIEW, self.recordVolume, self.bgVolume, self.offsetTime);
- }
- }
- #pragma mark ------ lazying
- - (void)setOffsetTime:(NSInteger)offsetTime {
- _offsetTime = offsetTime;
- NSString *tips = @"";
- if (offsetTime > 0) {
- tips = [NSString stringWithFormat:@"演奏提前%zd毫秒", labs(offsetTime)];
- self.pointLeft.constant = 87 + labs(offsetTime) / 20.0 * 3;
- }
- else if (offsetTime == 0) {
- tips = @"拖动指针移动演奏音频";
- self.pointLeft.constant = 87;
- }
- else {
- tips = [NSString stringWithFormat:@"演奏延后%zd毫秒", labs(offsetTime)];
- self.pointLeft.constant = 87 - labs(offsetTime) / 20.0 * 3;
- }
- self.offsetTipsLabel.text = tips;
- }
- - (void)setHideBackView:(BOOL)hideBackView {
- _hideBackView = hideBackView;
- if (hideBackView) {
- self.recordTitle.hidden = YES;
- self.reRecordImage.hidden = YES;
- self.recordImageRight.constant = 0.0f;
- self.recordImgWidth.constant = 0.0f;
- self.recordButton.userInteractionEnabled = NO;
- }
- else {
- self.recordTitle.hidden = NO;
- self.reRecordImage.hidden = NO;
- self.recordImageRight.constant = 20.0f;
- self.recordImgWidth.constant = 24.0f;
- self.recordButton.userInteractionEnabled = YES;
- }
- }
- /*
- // Only override drawRect: if you perform custom drawing.
- // An empty implementation adversely affects performance during animation.
- - (void)drawRect:(CGRect)rect {
- // Drawing code
- }
- */
- @end
|