рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ iPhone рдкрд░ 3DTouch рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрд╛ред рдЕрдм рдпрд╣ рд╕реНрдЯреНрд░реЛрдХ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддреИрдпрд╛рд░ рд╣реИ, рдХреЗрд╡рд▓ рд╕реБрдзрд╛рд░ рд╣реИрдВ:
- рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рдореИрдВ iPhone 6s рдкрд░ рд╣рд╛рдкреНрдЯрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ
- рдпреВрдЖрдИрдмреЗрд▓ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реЛрддрд╛ рд╣реИ, (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдерд╛) рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рдЪрд┐рдХрдирд╛рдИ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рджрдмрд╛рдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЕрд░реНрдзрд╡реГрддреНрддрд╛рдХрд╛рд░ рдЪрдХреНрд░ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рд╡реНрдпрд╛рд╕ рдмрдврд╝рддреЗ рджрдмрд╛рд╡ рдХреЗ рд╕рд╛рде рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдШрдЯрддреЗ рджрдмрд╛рд╡ рдХреЗ рд╕рд╛рде рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдкрд╣рд▓реЗ рджреЛ рдЕрдВрдХ рдореИрдВ рдпрд╛ рддреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдПрдирд┐рдореЗрдЯреЗрдб
GIF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рд▓рд┐рдП, рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рд╡рд░реНрдзрди рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕реНрд╡рдпрдВ рдЬрд╛рдВрдЪреЗрдВред рдФрд░ рдпрд╣рд╛рдВ рдореИрдВ рддреАрд╕рд░реЗ рдмрд┐рдВрджреБ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдРрдб-рдСрди рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред
рдХрдВрдкрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ Haptic рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
рд╣рдо
ViewController рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рд╕реЗ рдкрд╣рд▓реЗ
AudioToolbox рдврд╛рдВрдЪреЗ рдХрд╛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдВрдкрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рджреЛрд╣рд░рд╛рдпрд╛
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
isPlaySound рд╕рдВрдкрддреНрддрд┐ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
import UIKit import AudioToolbox class ViewController: UIViewController { @IBOutlet weak var scaleView: ScaleView! @IBOutlet weak var forceLabel: UILabel! @IBOutlet weak var grammLabel: UILabel! var isPlaySound = true ...
рдЕрдЧрд▓рд╛,
рдЯрдЪрдореЗрд╡реНрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ
(: :) рд╡рд┐рдзрд┐ рддрд╛рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣
рджрд┐рдЦреЗ :
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { cicrcleView.center = touch.location(in: view) if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == UIForceTouchCapability.available { if touch.force >= touch.maximumPossibleForce { forceLabel.text = "100%+ force" grammLabel.text = "385 " if isPlaySound { // // 1 AudioServicesPlaySystemSound(1519) isPlaySound = false // 2 } } else { let force = (touch.force / touch.maximumPossibleForce) * 100 let grams = force * 385 / 100 let roundGrams = Int(grams) isPlaySound = true // // 3 forceLabel.text = "\(Int(force))% force" grammLabel.text = "\(roundGrams) " } } } } }
рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдЬрдм рдЖрдк iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм
ViewController рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ
рд╣реИрдВ рдФрд░
isPlaySound рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ
, рддреЛ рд╣рдо рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ рдЦреЗрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ - рдХрдВрдкрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕рд╣рд┐рддред рдЬрдм рдЕрдзрд┐рдХрддрдо рджрдмрд╛рд╡
рдкрд╣реБрдБрдЪ рдЬрд╛рддрд╛ рд╣реИ, isPlaySound (1) рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣
рд╕рддреНрдп рд╣реИ , рддреЛ рдХрдВрдкрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдВрдкрди рдЦреЗрд▓рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз (2) рддреБрд░рдВрдд рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╖реЗрдз рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (3) рдпрджрд┐ рджрдмрд╛рд╡ рдмрд▓ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдореВрд▓реНрдп рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд┐рдХрдирд╛ рдЕрджреНрдпрддрди
рдЕрдм рд╕рд╣рдЬрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдЯрдЪ рдЕрдкрдбреЗрдЯ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЖрддреЗ рд╣реИрдВ,
рд╕реНрдкрд░реНрд╢ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЧрддрд┐ рдХреЗ рд╕рд╛рде
(: :) рд╡рд┐рдзрд┐, рдФрд░ рдпрд╣ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХрдИ рд╕реМ рдСрдкрд░реЗрд╢рди рд╣реИрдВред рд▓реЗрдмрд▓ рдХреА рддрд╛рдЬрд╝рд╛ рджрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
ViewController isUpdate рд╡рд░реНрдЧ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реА рдФрд░
didSet рдЧреБрдг
рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ред
var isUpdate = true { didSet { if isUpdate == false { DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { self.isUpdate = oldValue } } } }
рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЭреВрдареЗ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣
0.01 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рд╕рдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЬрдм
рдпреВрдмреЗрд▓рдм рдХреЛ рдкрд╛рда рд▓рд┐рдЦрддреЗ рд╣реИрдВ
, рддреЛ рд╣рдо
isUpdate рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдорд╛рди
рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рддрдм рддрдХ рд▓реЗрдмрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣
рд╕рддреНрдп рди рд╣реЛ
рдЬрд╛рдП ред рдЗрд╕рд▓рд┐рдП, рд░рд┐рдХреЙрд░реНрдб рд╣рдорд╛рд░реЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд╣рд░ рд╕реМрд╡реЗрдВ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВред
рдЯрдЪрдореЗрд╡рдб рдореЗрдВ: (:) рд╡рд┐рдзрд┐, рдЙрд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬрд╣рд╛рдБ рд╣рдо% рд╢рдХреНрддрд┐ рдФрд░ рд╡рдЬрди рдХреЛ рдЧреНрд░рд╛рдо рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХреЛрдб рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВ:
if isUpdate { forceLabel.text = "\(Int(force))% force" grammLabel.text = "\(roundGrams) " isUpdate = false }
рд▓реЗрдмрд▓ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЪрд┐рдХрдирд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛
рд╕реНрдкрд░реНрд╢ рджреГрд╢реНрдп
рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╣рдо рдПрдХ
рдпреВрдЖрдИрд╡реАрдИрд╡рд╛рдИ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкрд╛рд░рднрд╛рд╕реА рдФрд░ рдЧреЛрд▓ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
ViewController рд╡рд░реНрдЧ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ рдФрд░
viewDidLoad () рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд░реЗрдВ
let cicrcleView = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 80)) // View 80 80 override func viewDidLoad() { super.viewDidLoad() forceLabel.text = "0% force" grammLabel.text = "0 " cicrcleView.layer.cornerRadius = 40 // View - cicrcleView.alpha = 0.6 // 60% cicrcleView.backgroundColor = UIColor.red }
рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ
рджреГрд╢реНрдп рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕рдордп рдЖрдк рд╕реНрдкрд░реНрд╢ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
ViewController рдореЗрдВ рдЖрдкрдХреЛ
touchesBegan (: :) рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { cicrcleView.center = touch.location(in: view)
рд╣рдо рдЯрдЪ рдХреЗ рд╕реЗрдЯ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рднреА рдЪреБрдирддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЯрдЪ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
- рд╕рд░реНрдХрд▓ рд╡реНрдпреВ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рд╕реНрдкрд░реНрд╢ рдмрд┐рдВрджреБ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ
- рд╕реНрдХреНрд░реАрди рдкрд░ cicrcleView рдЬреЛрдбрд╝реЗрдВ
рдЫреБрдЖрдЫреВрдд рдореЗрдВ: (:) рд╢рд╛рдЦрд╛ рдореЗрдВ рд╡рд┐рдзрд┐ рдЬрд╣рд╛рдВ рдкреНрд░рддрд┐рд╢рдд рдФрд░ рд╡рдЬрди рдЧреНрд░рд╛рдо рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:
cicrcleView.transform = CGAffineTransform.init(scaleX: CGFloat(1 + (grams / 5) / 20), y: CGFloat(1 + (grams / 5) / 20))
рдпрд╣рд╛рдВ рд╣рдо рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ
cicrcleView рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдореИрдВрдиреЗ рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡реЗ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред рдЪрдпрди рд╡рд┐рдзрд┐ "рдкреНрд░рд╣рд╛рд░ред" рддреЛ рдЖрдк рдЙрди рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдФрд░ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реНрдкрд░реНрд╢ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ
cicrleView рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдкрд░реНрд╢ рдореЗрдВ (: :) рд╡рд┐рдзрд┐, рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { forceLabel.text = "0% force" grammLabel.text = "0 "
рдкреВрд░рд╛
ViewController рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
import UIKit import AudioToolbox class ViewController: UIViewController { @IBOutlet weak var scaleView: ScaleView! @IBOutlet weak var forceLabel: UILabel! @IBOutlet weak var grammLabel: UILabel! var isPlaySound = true var isUpdate = true { didSet { if isUpdate == false { DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { self.isUpdate = oldValue } } } } let cicrcleView = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 80)) override func viewDidLoad() { super.viewDidLoad() forceLabel.text = "0% force" grammLabel.text = "0 " cicrcleView.layer.cornerRadius = 40 cicrcleView.alpha = 0.6 cicrcleView.backgroundColor = UIColor.red } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { cicrcleView.center = touch.location(in: view) // 1 view.addSubview(cicrcleView) // 2 } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { cicrcleView.center = touch.location(in: view) if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == UIForceTouchCapability.available { if touch.force >= touch.maximumPossibleForce { forceLabel.text = "100%+ force" grammLabel.text = "385 " if isPlaySound { AudioServicesPlaySystemSound(1519) isPlaySound = false } } else { let force = (touch.force / touch.maximumPossibleForce) * 100 let grams = force * 385 / 100 let roundGrams = Int(grams) isPlaySound = true if isUpdate { forceLabel.text = "\(Int(force))% force" grammLabel.text = "\(roundGrams) " isUpdate = false } cicrcleView.transform = CGAffineTransform.init(scaleX: CGFloat(1 + (grams / 5) / 20), y: CGFloat(1 + (grams / 5) / 20)) } } } } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { forceLabel.text = "0% force" grammLabel.text = "0 " cicrcleView.removeFromSuperview() cicrcleView.transform = .identity } }
рд╕реНрдХреЗрд▓ рд╡реНрдпреВ рдлрд╛рдЗрд▓
рдХреЛрдб :
import UIKit @IBDesignable class ScaleView: UIView { override func draw(_ rect: CGRect) { let context = UIGraphicsGetCurrentContext() context?.setStrokeColor(UIColor.red.cgColor) context?.setLineWidth(14.0) context?.addArc(center: CGPoint(x: 375 / 2, y: 375 / 2), radius: 375 / 2 - 14, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true) context?.strokePath() context?.setLineWidth(1.0) context?.setStrokeColor(UIColor.lightGray.cgColor) context?.addArc(center: CGPoint(x: 375 / 2, y: 375 / 2), radius: 375 / 4 - 14, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true) context?.strokePath() } }
рдЧрд┐рдЯрд╣рдм рдкрд░ рд▓рд┐рдВрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛