Zoeken…


subklassen

Subklasse UIControl geeft ons toegang tot de volgende methoden:

  • beginTrackingWithTouch wordt genoemd wanneer de vinger voor het eerst binnen de grenzen van het besturingselement raakt.
  • continueTrackingWithTouch wordt herhaaldelijk aangeroepen als de vinger over het besturingselement schuift en zelfs buiten de grenzen van het besturingselement.
  • endTrackingWithTouch wordt opgeroepen wanneer de vinger van het scherm komt.

MyCustomControl.swift

import UIKit

// These are out self-defined rules for how we will communicate with other classes
protocol ViewControllerCommunicationDelegate: class {
    func myTrackingBegan()
    func myTrackingContinuing(location: CGPoint)
    func myTrackingEnded()
}

class MyCustomControl: UIControl {

    // whichever class wants to be notified of the touch events must set the delegate to itself
    weak var delegate: ViewControllerCommunicationDelegate?
    
    override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
        
        // notify the delegate (i.e. the view controller)
        delegate?.myTrackingBegan()
        
        // returning true means that future events (like continueTrackingWithTouch and endTrackingWithTouch) will continue to be fired
        return true
    }
    
    override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
        
        // get the touch location in our custom control's own coordinate system
        let point = touch.locationInView(self)
        
        // Update the delegate (i.e. the view controller) with the new coordinate point
        delegate?.myTrackingContinuing(point)
        
        // returning true means that future events will continue to be fired
        return true
    }
    
    override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) {
        
        // notify the delegate (i.e. the view controller)
        delegate?.myTrackingEnded()
    }
}

ViewController.swift

Dit is hoe de weergavecontroller is ingesteld om de gemachtigde te zijn en te reageren op aanraakgebeurtenissen vanuit ons aangepaste besturingselement.

import UIKit
class ViewController: UIViewController, ViewControllerCommunicationDelegate {
    
    @IBOutlet weak var myCustomControl: MyCustomControl!
    @IBOutlet weak var trackingBeganLabel: UILabel!
    @IBOutlet weak var trackingEndedLabel: UILabel!
    @IBOutlet weak var xLabel: UILabel!
    @IBOutlet weak var yLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        myCustomControl.delegate = self
    }

    func myTrackingBegan() {
        trackingBeganLabel.text = "Tracking began"
    }
    
    func myTrackingContinuing(location: CGPoint) {
        xLabel.text = "x: \(location.x)"
        yLabel.text = "y: \(location.y)"
    }
    
    func myTrackingEnded() {
        trackingEndedLabel.text = "Tracking ended"
    }
}

Notes

  • Alternatieve methoden om hetzelfde resultaat te bereiken zonder subklasse, zijn het toevoegen van een doel of het gebruik van een gebaarherkenning.

  • Het is niet nodig om een gemachtigde met deze methoden te gebruiken als deze alleen binnen het aangepaste besturingselement zelf worden gebruikt. We hadden net een print statement kunnen toevoegen om te laten zien hoe de evenementen worden genoemd. In dat geval zou de code worden vereenvoudigd

      import UIKit
      class MyCustomControl: UIControl {
    
          override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
              print("Began tracking")
              return true
          }
      
          override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
              let point = touch.locationInView(self)
              print("x: \(point.x), y: \(point.y)")
              return true
          }
      
          override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) {
              print("Ended tracking")
          }
      }
    

Maak een instantie

Snel

let viewController = UIViewController()

Doelstelling C

UIViewController *viewController = [UIViewController new];

Stel de weergave programmatisch in

Snel

class FooViewController: UIViewController {

  override func loadView() {
    view = FooView()
  }

}

Instantiëren vanaf een Storyboard

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

Met een ID :

Geef de scène een Storyboard-ID in de identiteitscontrole van het storyboard.

voer hier de afbeeldingsbeschrijving in

Instantiëren in code:

UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"myIdentifier"];

Direct een eerste viewcontroller starten :

Selecteer in het storyboard de weergavecontroller en selecteer vervolgens de kenmerkcontrole, schakel het selectievakje "Is initiële weergavecontroller" in.

voer hier de afbeeldingsbeschrijving in

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateInitialViewController];

Open de containerweergavecontroller

Wanneer de weergavecontroller wordt gepresenteerd in een tabbalkcontroller, kunt u de tabbalkcontroller als volgt openen:

Snel

let tabBarController = viewController.tabBarController

Doelstelling C

UITabBarController *tabBarController = self.tabBarController;

Wanneer de weergavecontroller deel uitmaakt van een navigatiestapel, kunt u de navigatiecontroller als volgt openen:

Snel

let navigationController = viewController.navigationController

Doelstelling C

UINavigationController *navigationController = self.navigationController;

Een kinderweergavecontroller toevoegen / verwijderen

Een kinderweergavecontroller toevoegen:

- (void)displayContentController:(UIViewController *)vc {
   [self addChildViewController:vc];
   vc.view.frame = self.view.frame;
   [self.view addSubview:vc.view];
   [vc didMoveToParentViewController:self];
}

Een child view-controller verwijderen:

- (void)hideContentController:(UIViewController *)vc {
   [vc willMoveToParentViewController:nil];
   [vc.view removeFromSuperview];
   [vc removeFromParentViewController];
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow