2017-01-17 3 views
1

UIScrollView 설정이 있지만보기를 변경할 때 음악이 중지되지 않습니다. 보기를 바꿀 때 음악이 멈추도록하려면 어떻게해야합니까?음악이 변경되도록 UIScrollView에서보기 변경

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    meditationState = .on 
    setTrackForPlayerWith(trackName: "Bigsur") 
    player.play() 
    player.numberOfLoops = -1 

} 

다음은 viewcontroller.swift의 전체 클래스입니다. 내가 언급 한 func scrollViewDidScroll 및 자체 부분을 추가했지만 여전히 작동하지 않습니다.

import UIKit 

class ViewController: UIViewController, UIScrollViewDelegate { 

@IBOutlet weak var scrollView: UIScrollView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let vc0 = ViewController0(nibName: "ViewController0", bundle: nil) 

    var frame0 = vc0.view.frame 
    frame0.origin.x = self.view.frame.size.width 
    vc0.view.frame = frame0 

    self.addChildViewController(vc0) 
    self.scrollView.addSubview(vc0.view) 
    vc0.didMove(toParentViewController: self) 

    let vc1 = ViewController1(nibName: "ViewController1", bundle: nil) 

    var frame1 = vc1.view.frame 
    frame1.origin.x = self.view.frame.size.width 
    vc1.view.frame = frame1 

    self.addChildViewController(vc1) 
    self.scrollView.addSubview(vc1.view) 
    vc1.didMove(toParentViewController: self) 

    let vc2 = ViewController2(nibName: "ViewController2", bundle: nil) 

    var frame2 = vc2.view.frame 
    frame2.origin.x = self.view.frame.size.width * 2 
    vc2.view.frame = frame2 

    self.addChildViewController(vc2) 
    self.scrollView.addSubview(vc2.view) 
    vc2.didMove(toParentViewController: self) 

    let vc3 = ViewController3(nibName: "ViewController3", bundle: nil) 

    var frame3 = vc3.view.frame 
    frame3.origin.x = self.view.frame.size.width * 3 
    vc1.view.frame = frame3 

    self.addChildViewController(vc3) 
    self.scrollView.addSubview(vc3.view) 
    vc3.didMove(toParentViewController: self) 

    self.scrollView.contentSize = CGSize(width:  Double(self.view.frame.size.width * 4), height: Double(self.view.frame.size.height - 66)) 

    self.scrollView.delegate = self 

    } 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if scrollView.contentOffset.x > self.view.frame.size.x { 
     player.stop() 
    } 
} 

}

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

ViewController3는 '플레이어'가 선언된다 :

import UIKit 
import AVFoundation 

enum MeditationState { 
    case on 
    case off 
} 

class ViewController3: UIViewController { 

    var player:AVAudioPlayer = AVAudioPlayer() 
    var player1:AVAudioPlayer = AVAudioPlayer() 
    var meditationState: MeditationState? 
    var replicatorLayer = CAReplicatorLayer() 
    var dot = CALayer() 

    func updateTimer(){ 

     seconds += 1 
     timerclock.text = "\(seconds)" 
    } 

    // Animation starts running 

    func animation2() { 

     // A layer that creates a specified number of copies of its sublayers (the source layer), each copy potentially having geometric, temporal, and color transformations applied to it. 
     replicatorLayer = CAReplicatorLayer() 

     // The layer’s bounds rectangle. Animatable. 
     replicatorLayer.bounds = CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0) 

     // The radius to use when drawing rounded corners for the layer’s background. Animatable. 
     replicatorLayer.cornerRadius = 10.0 

     // The background color of the receiver. Animatable. 
     replicatorLayer.backgroundColor = UIColor(white: 0.0, alpha: 0.0).cgColor 

     // The layer’s position in its superlayer’s coordinate space. Animatable. 
     replicatorLayer.position = view.center 

     // calling this method creates an array for that property and adds the specified layer to it. 
     view.layer.addSublayer(replicatorLayer) 


     // connectng the animation to the content 

     // An object that manages image-based content and allows you to perform animations on that content 
     dot = CALayer() 

     // The layer’s bounds rectangle. Animatable. 
     dot.bounds = CGRect(x: 0.0, y: 0.0, width: 12.0, height: 12.0) 

     //The layer’s position in its superlayer’s coordinate space. Animatable. 
     dot.position = CGPoint(x: 150.0, y: 40.0) 

     //The background color of the receiver. Animatable. 
     dot.backgroundColor = UIColor(white: 0.2, alpha: 1.0).cgColor 

     // The color of the layer’s border. Animatable. 
     dot.borderColor = UIColor(white: 1.0, alpha: 1.0).cgColor 

     // The width of the layer’s border. Animatable. 
     dot.borderWidth = 1.0 

     //The radius to use when drawing rounded corners for the layer’s background. Animatable. 
     dot.cornerRadius = 5.0 


     //Appends the layer to the layer’s list of sublayers. 
     replicatorLayer.addSublayer(dot) 

     // number of copies of layer is instanceCount 

     let nrDots: Int = 1000 

     //The number of copies to create, including the source layers. 
     replicatorLayer.instanceCount = nrDots 

     // The basic type for floating-point scalar values in Core Graphics and related frameworks. 
     let angle = CGFloat(2*M_PI)/CGFloat(nrDots) 

     // The transform matrix applied to the previous instance to produce the current instance. Animatable. 
     replicatorLayer.instanceTransform = CATransform3DMakeRotation(angle, 0.0, 0.0, 1.0) 

     // Type used to represent elapsed time in seconds. 
     let duration: CFTimeInterval = 10.0 

     // animation capabilities for a layer property. 

     // An object that provides basic, single-keyframe animation capabilities for a layer property. 
     let shrink = CABasicAnimation(keyPath: "transform.scale") 

     // Defines the value the receiver uses to start interpolation. 
     shrink.fromValue = 1.0 

     // Defines the value the receiver uses to end interpolation. 
     shrink.toValue = 0.1 

     // Specifies the basic duration of the animation, in seconds. 
     shrink.duration = duration 

     // Determines the number of times the animation will repeat. 
     shrink.repeatCount = Float.infinity 

     // Add the specified animation object to the layer’s render tree. 
     dot.add(shrink, forKey: "shrink") 

     // Specifies the delay, in seconds, between replicated copies. Animatable. 
     replicatorLayer.instanceDelay = duration/Double(nrDots) 

     // The transform applied to the layer’s contents. Animatable. 
     dot.transform = CATransform3DMakeScale(0.01, 0.01, 0.01) 
    } 

    // connecting the breathe in label 

    @IBOutlet weak var label: UILabel! 

    // instant delay 

    @IBOutlet weak var instantDelay: UIButton! 
    @IBAction func delayBtn(_ sender: Any) { 

     dot.removeAnimation(forKey: "shrink") 
     timer1.invalidate() 
     seconds = 0 
     timer2.invalidate() 
     timerclock.text = "\(seconds)" 
     time = 0 
     timerLabel.text = "Breathe in" 
     timerisOn = false 
     pauseBtn.isHidden = true 
     playBtn.isHidden = false 

     label.isHidden = true 
     replicatorLayer.isHidden = true 
     instantDelay.isHidden = true 
     instantDelay1.isHidden = false 
     slider.isHidden = false 
    } 

    // Delay 1 

    @IBOutlet weak var instantDelay1: UIButton! 
    @IBAction func delayBtn1(_ sender: Any) { 


     instantDelay1.isHidden = true 
     instantDelay.isHidden = false 
     label.isHidden = false 
     slider.isHidden = true 
    } 


    //Slider for changing animation speed 

    @IBOutlet weak var slider: UISlider! 
    @IBAction func slider(_ sender: Any) { 

    } 

    @IBAction func speed(_ sender: UISlider) { 
     view.layer.speed = sender.value 

    } 



    //Sound On button 

    @IBOutlet weak var soundOn: UIButton! 
    @IBAction func SoundOn(_ sender: Any) { 
     meditationState = .on 
    setTrackForPlayerWith(trackName: "Mute") 
     player.play() 
     soundoff.isHidden = false 
     soundOn.isHidden = true 
    } 

    //Sound Off button 

    @IBOutlet weak var soundoff: UIButton! 
    @IBAction func SoundOff(_ sender: Any) { 
     meditationState = .off 
     setTrackForPlayerWith(trackName: "Bigsur") 
     player.play() 
     soundoff.isHidden = true 
     soundOn.isHidden = false 
    } 

    //Timerclock at top of screen label 

    @IBOutlet weak var timerclock: UILabel! 

    // creating vars to set things 

    var animation = CFTimeInterval() 
    var timer1 = Timer() 
    var timer2 = Timer() 
    var time = 0 
    var seconds = 0 
    var timerisOn = false 

    // connecting breathe in label 

    @IBOutlet var question: UILabel! 

    var arrayOfStrings: [String] = [""] 

    // connecting timerclick and starting it 
    @IBOutlet var timerLabel: UILabel! 

    // changes the amount of time on the label of different labels 
    func increaseTimer() { 

     time += 1 

     switch time { 
     case 0 ... 7: 
      timerLabel.text = "Hold" 
     case 8 ... 10: 
      timerLabel.text = "Breathe Out" 
     case 11 ... 12: 
      timerLabel.text = "Breathe in" 
     default: 
      time = 0 
     } 

    } 

    // connecting the play button and vars 
    @IBOutlet weak var playBtn: UIButton! 
    @IBAction func play(sender: AnyObject) { 

     bell(trackName: "Bell") 
     player1.play() 

     timer1 = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController3.increaseTimer), userInfo: nil, repeats: true) 
     pauseBtn.isHidden = false 
     playBtn.isHidden = true 
     if timerisOn == false { 


     timer2 = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true) 
      timerisOn = true 
     } 
     animation2() 
    } 


    // pausing the timer with the vars 

    @IBOutlet weak var pauseBtn: UIButton! 
    @IBAction func pause(sender: AnyObject) { 
     dot.removeAnimation(forKey: "shrink") 
     timer1.invalidate() 
     seconds = 0 
     timer2.invalidate() 
     timerclock.text = "\(seconds)" 
     time = 0 
     timerLabel.text = "Breathe in" 
     timerisOn = false 
     pauseBtn.isHidden = true 
     playBtn.isHidden = false 

     } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     meditationState = .on 
     setTrackForPlayerWith(trackName: "Bigsur") 
     player.play() 
     player.numberOfLoops = -1 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    time += 1 
     do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) 
      print("AVAudioSession Category Playback OK") 
      do { 
       try AVAudioSession.sharedInstance().setActive(true) 
       print("AVAudioSession is Active") 
      } catch let error as NSError { 
       print(error.localizedDescription) 
      } 
     } catch let error as NSError { 
      print(error.localizedDescription) 
     } 

    } 

     func setTrackForPlayerWith(trackName: String) { 
      do 
      { 
       let audioPath = Bundle.main.path(forResource: trackName, ofType: "mp3") 
       try player = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL) 
      } 
      catch 
      { 
       //ERROR 
      } 
     } 


    func bell(trackName: String) { 
     do 
     { 
      let audioPath = Bundle.main.path(forResource: trackName, ofType: "mp3") 
      try player1 = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL) 
     } 
     catch 
     { 
      //ERROR 
     } 
    } 

     override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



} 
+0

변경보기는 viewController를 변경하거나 scrollView에서 새보기로 스크롤하는 것을 의미합니까? – dirtydanee

+0

스크롤보기의 새보기로 스크롤 –

+0

보기의 너비는 얼마입니까? – dirtydanee

답변

0

당신은 다양한 대리자 메서드에 UIScrollView 서브 클래스에서 변경을 관찰 할 수있다.

먼저 scrollView의 위임자가 viewController에 할당되어 있는지 확인하십시오. 이렇게하려면, 하나의 옵션은 viewDidLoad()이 작업이 완료되면

// `scrollView` should be whatever is your scrollView called in your VC 
self.scrollView.delegate = self 

에 다음을 추가하는 것입니다, 당신의 UIViewController 서브 클래스가 UIScrollViewDelegate

class ViewController: UIViewController, UIScrollViewDelegate { 

    func scrollViewDidScroll(_ scrollView: UIScrollView) { 
     if scrollView.contentOffset.x > self.view.frame.size.x { 
      player.stop() 
     } 
    } 
} 

UIScrollViewDelegate을 준수 할 수 있도록하는 것은있는 ScrollView의 변화를 관찰하는 다양한 방법이있다. scrollViewDidScroll(_:)은 scrollView와 상호 작용할 때마다 호출되므로 contentOffset이보기의 너비보다 커지면 곧 음악을 중지 할 수 있습니다.

+0

화면 또는 개별 화면에 연결된 기본 viewcontroller에 넣어야합니까? 나는 'self.scrollView.delegate = self'를 주 viewcontroller에 넣었고 uiviewdelegate를 입력하기 위해 viewcontroller에 값을 할당 할 수 없다고 말했습니까? 그런 다음 개별보기 컨트롤러에 대신 입력하려고하면 'viewcontroller3'유형의 값에 'scrollview'멤버가 없습니다. 이제 어떻게해야합니까? –

+0

scrollView는 어디에 정의되어 있습니까? 해당 ViewController로 이동해야합니다. – dirtydanee

+0

scrollView는 기본 viewcontroller에서 scrollView라고 불립니다. @IBOutlet weak var scrollView : UIScrollView! –

1

viewWillDisappear(_:)을 찾고 계십니까? 이 방법에서는보기를 변경할 때 player.stop()을 추가하여 음악을 중지 할 수 있습니다.

+0

나는 그것을 줄 것이다. 고마워. –

+0

나는 다음을 추가했습니다 : override func viewWillDisappear (_ animated : Bool) { player.stop() } –

+0

그래도 작동하지 않습니다. 보기를 변경할 때 오른쪽으로 스 와이프하면 음악을 계속 볼 수 있습니다. 해결 방법에 대해 다른 아이디어가 있다면 알려주십시오. –

1

이 작업을 수행하는 간단한 방법은 ....

수직 테이블이라고합시다.

각 테이블보기 셀에는 연결된 오디오 트랙이 있습니다. C - - 특정 셀의 생각은 오디오 트랙 A.보기가 스크롤

2 (즉,이 이동 될 때마다), 단지 C

3 프레임를 얻을 수 있습니다 그냥 높이 가져 가라. 그런 다음 화면 SH 높이를 가져갑니다. 그럼 화면의 중심에서 C의 거리를 .. 그래서 복근 (SH - H). 그런 다음 그 숫자를 SH의 분수 (0에서 1)로 가져옵니다. 그래서, 애비 (SH - H)

/H (즉, 오히려 화면 높이보다 세포의 높이로 나눈 경우 상황에 따라, 그것은 더 좋을 수 있습니다.)

4. 지금. 단순히 모든 오디오 트랙 A의 볼륨 을 해당 분수으로 설정하십시오. 사실 모든 셀에 대해 그렇게하십시오.

스크롤 할 때 오디오가 다양한 트랙 사이에서 섞입니다.

"Magic":)