{"id":321037,"date":"2021-04-07T09:01:02","date_gmt":"2021-04-07T09:01:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=321037"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=321037","title":{"rendered":"\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431-\u0431\u0430\u0440 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439: CAShapeLayer \u0438 UIResponderChain"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! <\/p>\n<p>\u0414\u0438\u0437\u0430\u0439\u043d \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043b\u0438\u044f\u044f \u043d\u0430 \u0435\u0433\u043e \u0443\u0441\u043f\u0435\u0445. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0447\u0430\u0441\u0442\u043e \u043e\u0442\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c, \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u0430\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0432\u0437\u0433\u043b\u044f\u0434, \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f user retention (\u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439).<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432: \u0442\u0430\u0431-\u0431\u0430\u0440 \u0441 \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0439 \u0446\u0432\u0435\u0442 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/174\/abb\/e31\/174abbe314d923984f4be297e7e5817a.png\" width=\"780\" height=\"440\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u043d\u0435\u043c.<\/p>\n<h4>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p><code>UIKit<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u2013 <code>UITabBarController<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0441\u0442 \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u0437\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>ViewController<\/code>\u2019\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>tabBarItem.title<\/code> \u0438 <code>tabBarItem.image<\/code> \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>ViewController<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438, \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0430.<\/p>\n<h4>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Xcode, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u0444\u0430\u0439\u043b <code>Main.storyboard <\/code> \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 <code>ViewController<\/code>. \u0412 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u0435\u043d\u044e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 <code>Editor -&gt; Embed In<\/code> \u0438 \u0432\u044b\u0431\u0435\u0440\u0435\u043c <code>Tab Bar Controller<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448 <code>ViewController<\/code> \u0432<code>TabBarController<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3ab\/b18\/ed1\/3abb18ed1e2b7b00c49d044ec0352f48.png\" width=\"1600\" height=\"1274\"><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u043c <code>tabBarItem<\/code>. \u0412\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0434. \u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7c8\/142\/f3f\/7c8142f3fc6e5816e3e68e3340faea36.png\" width=\"1600\" height=\"1334\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u0444\u0430\u0439\u043b <code>ViewController.swift<\/code> \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0432 <code>MainTabBarController<\/code>, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u0437\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0435\u0439 Command \u0438 \u0432\u044b\u0431\u0440\u0430\u0432 <code>Rename<\/code> \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e:  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/afb\/b35\/67d\/afbb3567d8f778a42850233d6429c415.png\" width=\"489\" height=\"268\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 <code>UITabBarController<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>UIViewController<\/code>:  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/032\/2c7\/13f\/0322c713f16426262a5a54e614290016.png\" width=\"534\" height=\"199\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <code>Main.storyboard<\/code> \u0443 <code>TabBarController<\/code> \u0443\u043a\u0430\u0436\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>MainTabBarController<\/code>:  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/af7\/027\/415\/af70274154a0c398b5acc9dbecdb25d9.png\" width=\"258\" height=\"156\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <code>MainTabBarController<\/code> \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 (\u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043e\u043d \u0440\u0430\u0432\u0435\u043d 42), \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u043e\u0432, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0430\u043c\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438:  <\/p>\n<pre><code class=\"swift\">private let middleButtonDiameter: CGFloat = 42  private let redColor: UIColor = UIColor(red: 254.0 \/ 255.0, green: 116.0 \/ 255.0, blue: 96.0 \/ 255.0, alpha: 1.0) private let greenColor: UIColor = UIColor(red: 102.0 \/ 255.0, green: 166.0 \/ 255.0, blue: 54.0 \/ 255.0, alpha: 1.0)  private lazy var middleButton: UIButton = { \tlet middleButton = UIButton() \tmiddleButton.layer.cornerRadius = middleButtonDiameter \/ 2 \tmiddleButton.backgroundColor = redColor \tmiddleButton.translatesAutoresizingMaskIntoConstraints = false \treturn middleButton }()<\/code><\/pre>\n<p>\u0421\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>layer.cornerRadius<\/code>. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 2.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c <code>UIImageView<\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u0435\u0440\u0434\u0446\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<pre><code class=\"swift\">private lazy var heartImageView: UIImageView = { \tlet heartImageView = UIImageView() \theartImageView.image = UIImage(systemName: \"heart.fill\") \theartImageView.tintColor = .white \theartImageView.translatesAutoresizingMaskIntoConstraints = false \treturn heartImageView }()<\/code><\/pre>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>makeUI()<\/code> \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:  <\/p>\n<pre><code class=\"swift\">private func makeUI() { \t\/\/ 1 \ttabBar.addSubview(middleButton) \tmiddleButton.addSubview(heartImageView)  \t\/\/ 2 \tNSLayoutConstraint.activate([ \t\t\/\/ 2.1 \t\tmiddleButton.heightAnchor.constraint(equalToConstant: middleButtonDiameter), \t\tmiddleButton.widthAnchor.constraint(equalToConstant: middleButtonDiameter), \t\t\/\/ 2.2 \t\tmiddleButton.centerXAnchor.constraint(equalTo: tabBar.centerXAnchor), \t\tmiddleButton.topAnchor.constraint(equalTo: tabBar.topAnchor, constant: -10) \t])  \t\/\/ 3 \tNSLayoutConstraint.activate([ \t\t\/\/ 3.1 \t\theartImageView.heightAnchor.constraint(equalToConstant: 15), \t\theartImageView.widthAnchor.constraint(equalToConstant: 18), \t\t\/\/ 3.2 \t\theartImageView.centerXAnchor.constraint(equalTo: middleButton.centerXAnchor), \t\theartImageView.centerYAnchor.constraint(equalTo: middleButton.centerYAnchor) \t]) }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<p>1. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>middleButton<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>subview<\/code> \u043d\u0430<code>tabBar<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 <code>heartImageView<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>subview<\/code> \u043d\u0430 <code>middleButton<\/code>;<\/p>\n<p>2. \u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0435\u0439\u043d\u0442\u044b \u0434\u043b\u044f <code>middleButton<\/code>:<\/p>\n<p>    2.1. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c;<\/p>\n<p>    2.2. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043d\u0442\u0440 \u043f\u043e \u043e\u0441\u0438 <code>x<\/code> \u0438 \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b: \u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043d\u0430\u0434 \u0442\u0430\u0431-\u0431\u0430\u0440\u043e\u043c \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<p>3. \u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0435\u0439\u043d\u0442\u044b \u0434\u043b\u044f <code>heartImageView<\/code>:<\/p>\n<p>    3.1. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c;<\/p>\n<p>    3.2. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043d\u0442\u0440 \u043f\u043e \u043e\u0441\u044f\u043c <code>x<\/code> \u0438 <code>y<\/code> \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f <code>heartImageView<\/code> \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 <code>middleButton<\/code>.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>makeUI()<\/code>&nbsp; \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>viewDidLoad()<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>MainTabBarController<\/code>:<\/p>\n<pre><code class=\"swift\">override func viewDidLoad() { \tsuper.viewDidLoad() \tmakeUI() }<\/code><\/pre>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442. \u0423 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9c1\/084\/073\/9c1084073435aaaf8ebbbed7886b902c.png\" width=\"1168\" height=\"369\"><figcaption><\/figcaption><\/figure>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 CAShapeLayer  <\/h4>\n<p>\u041f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u0432\u043e\u0434\u043a\u0430 \u043d\u0430\u0434 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0432 \u0444\u043e\u0440\u043c\u0435 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430. \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>CAShapeLayer<\/code>, \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430 <code>CALayer<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e <code>CustomTabBar.swift<\/code>, \u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u043c \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <code>UITabBar<\/code>: <\/p>\n<pre><code class=\"swift\">import UIKit  final class CustomTabBar: UITabBar {      }<\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <code>Main.storyboard<\/code> \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0442\u0430\u0431-\u0431\u0430\u0440 \u043d\u0430 <code>MainTabBarController<\/code> \u0438 \u0443\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>CustomTabBar<\/code>:  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/210\/8f9\/436\/2108f94364aff31b012e26c04b0c9a04.png\" width=\"846\" height=\"1059\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>CustomTabBar<\/code> \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431-\u0431\u0430\u0440\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0434\u043b\u044f \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430 \u043e\u0431\u0432\u043e\u0434\u043a\u0438:<\/p>\n<pre><code class=\"swift\">private var tabBarWidth: CGFloat { self.bounds.width } private var tabBarHeight: CGFloat { self.bounds.height } private var centerWidth: CGFloat { self.bounds.width \/ 2 } private let circleRadius: CGFloat = 27<\/code><\/pre>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438\u0446 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>CGPath<\/code> \u2013 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0443\u0442\u044c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f, \u0440\u0438\u0441\u0443\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0443:<\/p>\n<pre><code class=\"swift\">private func shapePath() -&gt; CGPath { \tlet path = UIBezierPath() \/\/ 1 \tpath.move(to: CGPoint(x: 0, y: 0)) \/\/ 2 \tpath.addLine(to: CGPoint(x: tabBarWidth, y: 0)) \/\/ 3 \tpath.addLine(to: CGPoint(x: tabBarWidth, y: tabBarHeight)) \/\/ 4 \tpath.addLine(to: CGPoint(x: 0, y: tabBarHeight)) \/\/ 5 \tpath.close() \/\/ 6 \treturn path.cgPath \/\/ 7 }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>path<\/code> \u0442\u0438\u043f\u0430 <code>UIBezierPath<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0443 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u0443\u0433\u043b\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0443\u0433\u043b\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0435\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0443\u0433\u043b\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c, \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044f\u0441\u044c \u0438\u0437 \u0442\u043e\u0447\u043a\u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>CGPath<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>CGPath<\/code> \u0434\u043b\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430:<\/p>\n<pre><code class=\"swift\">private func circlePath() -&gt; CGPath { \tlet path = UIBezierPath() \/\/ 1 \tpath.addArc(withCenter: CGPoint(x: centerWidth, y: 12), \/\/ 2 \t\t\t\tradius: circleRadius, \/\/ 3 \t\t\t\tstartAngle: 180 * .pi \/ 180, \/\/ 4 \t\t\t\tendAngle: 0 * 180 \/ .pi, \/\/ 5 \t\t\t\tclockwise: true) \/\/ 6 \treturn path.cgPath \/\/ 7 }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>path<\/code> \u0442\u0438\u043f\u0430 <code>UIBezierPath<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>addArc<\/code>, \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430. \u042d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u043f\u043e \u043e\u0441\u0438 <code>x<\/code> \u0438 \u0441 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u043c \u0432\u043d\u0438\u0437 \u043d\u0430 12 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u043e \u043e\u0441\u0438 <code>y<\/code> (\u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043d\u0430\u0434 \u0442\u0430\u0431-\u0431\u0430\u0440\u043e\u043c \u043d\u0430 15 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439).<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0434\u0438\u0443\u0441 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0433\u043e\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0443\u0433\u043e\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430 \u2013 \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>CGPath<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>drawTabBar()<\/code>, \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0432 \u0434\u0432\u0430 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u0443\u0435\u043c\u044b\u0445 <code>CALayer<\/code>:  <\/p>\n<pre><code class=\"swift\">private var shapeLayer: CALayer? private var circleLayer: CALayer?<\/code><\/pre>\n<pre><code class=\"swift\">private func drawTabBar() { \t\/\/ 1 \tlet shapeLayer = CAShapeLayer() \tshapeLayer.path = shapePath() \tshapeLayer.strokeColor = UIColor.lightGray.cgColor \tshapeLayer.fillColor = UIColor.white.cgColor \tshapeLayer.lineWidth = 1.0  \t\/\/ 2 \tlet circleLayer = CAShapeLayer() \tcircleLayer.path = circlePath() \tcircleLayer.strokeColor = UIColor.lightGray.cgColor \tcircleLayer.fillColor = UIColor.white.cgColor \tcircleLayer.lineWidth = 1.0          \t\/\/ 3 \tif let oldShapeLayer = self.shapeLayer { \t\tself.layer.replaceSublayer(oldShapeLayer, with: shapeLayer) \t} else if let oldShapeLayer = self.circleLayer { \t\tself.layer.replaceSublayer(oldShapeLayer, with: circleLayer) \t} else { \t\tself.layer.insertSublayer(shapeLayer, at: 0) \t\tself.layer.insertSublayer(circleLayer, at: 1) \t}  \t\/\/ 4 \tself.shapeLayer = shapeLayer \tself.circleLayer = circleLayer }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b:<\/p>\n<ol>\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>shapeLayer<\/code> \u0442\u0438\u043f\u0430 <code>CAShapeLayer<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043f\u043e \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430. \u0423 \u043d\u0435\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c, \u0446\u0432\u0435\u0442 \u043e\u0431\u0432\u043e\u0434\u043a\u0438, \u0446\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 <code>circleLayer<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>CAShapeLayer,<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0440\u0430\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u0434\u0430, \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2013 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 <code>insertSublayer<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 <code>draw(_:)<\/code> \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"swift\">override func draw(_ rect: CGRect) { \tdrawTabBar() }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441 <code>MainTabBarController<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 \u043c\u0435\u0442\u043e\u0434 <code>makeUI()<\/code>:  <\/p>\n<pre><code class=\"swift\">\/\/ 1 let firstVC = UIViewController() firstVC.view.backgroundColor = .yellow firstVC.tabBarItem.title = \"First VC\" firstVC.tabBarItem.image = UIImage(systemName: \"1.circle\")  \/\/ 2 let middleVC = UIViewController() middleVC.view.backgroundColor = .green middleVC.tabBarItem.title = \"Middle VC\"  \/\/ 3 let secondVC = UIViewController() secondVC.view.backgroundColor = .blue secondVC.tabBarItem.title = \"Second VC\" secondVC.tabBarItem.image = UIImage(systemName: \"2.circle\")  \/\/ 4 viewControllers = [firstVC, middleVC, secondVC]<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <code>ViewController<\/code>\u2019\u043e\u0432, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u043d\u0438\u0445 <code>backgroundColor<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u0431-\u0431\u0430\u0440\u0435, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>ViewController<\/code>\u2019\u043e\u0432 \u043d\u0430\u0448\u0435\u0433\u043e <code>UITabBarController<\/code>.<\/p>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442. \u0423 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0437\u0430\u0439\u043d:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e56\/7d3\/eda\/e567d3eda15694e93852c49e02999993.png\" width=\"1170\" height=\"369\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 <code>ViewController<\/code>\u2019\u0430\u043c\u0438, \u043d\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430 \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <code>MainTabBarController<\/code> \u0438 \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u043c\u0441\u044f \u043f\u043e\u0434 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b <code>UITabBarControllerDelegate<\/code>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>tabBar(_:didSelect:)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430. \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434:  <\/p>\n<pre><code class=\"swift\">extension MainTabBarController: UITabBarControllerDelegate {     override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {         let selectedIndex = self.tabBar.items?.firstIndex(of: item) \/\/ 1         if selectedIndex != 1 { \/\/ 2             middleButton.backgroundColor = redColor \/\/ 3         } else {             middleButton.backgroundColor = greenColor \/\/ 4         }     } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443:<\/p>\n<ol>\n<li>\n<p>\u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 <code>middleButton<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0432\u043d\u0430 1 (\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 <code>ViewController<\/code>\u2019\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>viewControllers<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>MainTabBarController<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0434\u0430, \u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043a\u0440\u0430\u0441\u043d\u044b\u0439.<\/p>\n<\/li>\n<\/ol>\n<h4>UIResponderChain<\/h4>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0446\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430, \u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u0440\u0443\u0433\u043b\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043c\u0435\u043d\u0430 <code>ViewController<\/code>&#8216;\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440 <code>tabBarItem<\/code>. \u041d\u043e \u0432\u0435\u0434\u044c \u043c\u044b \u043d\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u0440\u0443\u0433\u043b\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0430\u0431-\u0431\u0430\u0440\u0430, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 (\u0430 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code>tabBarItem<\/code> \u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f <code>ViewController<\/code>).<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/strong><\/p>\n<p>\u041e\u0442\u0432\u0435\u0442 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 <code>UIResponderChain<\/code> \u2013 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>UIResponder<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u043a\u0430\u0441\u0430\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 <code>view<\/code> (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u043a\u0440\u0443\u0433\u043b\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430) \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u0441\u0430\u043d\u0438\u0435, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u043a <code>parentView<\/code> (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u0442\u0430\u0431-\u0431\u0430\u0440), \u0434\u0430\u043b\u0435\u0435 \u2013 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f <code>UIView<\/code> <code>ViewController<\/code>&#8216;\u0430, \u0441\u0430\u043c <code>UIViewController<\/code>, <code>UIWindow<\/code>, <code>UIApplication<\/code> \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, <code>UIApplicationDelegate<\/code>.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0434 \u043d\u0430\u0448\u0435\u0439 \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <code>tabBarItem<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u0441\u0430\u043d\u0438\u0435, \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0435\u0442\u0441\u044f \u043d\u0430 <code>parentView<\/code> \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0441\u043c\u0435\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e <code>ViewController<\/code>&#8216;\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430?<\/p>\n<p>\u041f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 <code>view<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>hitTest(_:with:)<\/code><\/p>\n<blockquote>\n<p>UIKit uses view-based hit-testing to determine where touch events occur. Specifically, UIKit compares the touch location to the bounds of view objects in the view hierarchy. The <code>hitTest(_:with:)<\/code> method of UIView traverses the view hierarchy, looking for the deepest subview that contains the specified touch, which becomes the first responder for the touch event.  <\/p>\n<\/blockquote>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>point(inside:with:)<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439, \u0434\u043e\u043b\u0436\u043d\u0430 \u043b\u0438 <code>view<\/code> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043a\u0430\u0441\u0430\u043d\u0438\u044f:  <\/p>\n<blockquote>\n<p>Returns a Boolean value indicating whether the receiver contains the specified point.  <\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f <a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/touches_presses_and_gestures\/using_responders_and_the_responder_chain_to_handle_events\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Apple<\/a> \u0433\u043b\u0430\u0441\u0438\u0442:<\/p>\n<blockquote>\n<p>If a touch location is outside of a view\u2019s bounds, the <code>hitTest(_:with:)<\/code> method ignores that view and all of its subviews.<\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043d\u0435 \u0441 <code>subview<\/code> \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 (\u043a\u0440\u0443\u0433\u043b\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430), \u0430 \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 <code>UIView<\/code> <code>ViewController<\/code>&#8216;a, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u0441\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b <code>UIResponder<\/code> \u0432 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>point(inside:with:)<\/code> \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>CustomTabBar<\/code>:<\/p>\n<pre><code class=\"swift\">override func point(inside point: CGPoint, with event: UIEvent?) -&gt; Bool { \tlet pointIsInside = super.point(inside: point, with: event) \/\/ 1 \tif pointIsInside == false { \/\/ 2 \t\tfor subview in subviews { \/\/ 2.1 \t\t\tlet pointInSubview = subview.convert(point, from: self) \/\/ 2.2 \t\t\tif subview.point(inside: pointInSubview, with: event) { \/\/ 2.3 \t\t\t\treturn true \/\/ 2.3.1 \t\t\t} \t\t} \t} \treturn pointIsInside \/\/ 3 }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043a\u0430\u0441\u0430\u043d\u0438\u044f \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 (<code>bounds<\/code>) \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>false<\/code>).<\/p>\n<p>2. \u0415\u0441\u043b\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432\u043d\u0435 <code>bounds<\/code> \u0442\u0430\u0431-\u0431\u0430\u0440\u0430:<\/p>\n<p>    2.1. \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c <code>subview<\/code> \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.<\/p>\n<p>    2.2. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>convert(_:from:)<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0434\u0430\u043d\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <code>subview<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u0440\u0443\u0433\u043b\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0440\u043e\u0432\u043d\u043e \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>CGPoint<\/code> \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 <code>x: 21.0, y: 0.0<\/code> (\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u0442\u043e\u0447\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <code>x: 195.0, y: -10.0<\/code>, \u0433\u0434\u0435 <code>\u0445<\/code> \u2013 \u0446\u0435\u043d\u0442\u0440 \u044d\u043a\u0440\u0430\u043d\u0430, \u0430 <code>y<\/code> \u2013 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430\u0434 \u0442\u0430\u0431-\u0431\u0430\u0440\u043e\u043c).<\/p>\n<p>    2.3. \u0415\u0441\u043b\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>subview<\/code>:<\/p>\n<p>    2.3.1. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c <code>true<\/code> \u2013 <code>subview<\/code> \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u0441\u0430\u043d\u0438\u0435.<\/p>\n<p>3. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e <code>subview<\/code> \u043d\u0435 \u0434\u0430\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c <code>false<\/code> \u2013 \u043a\u0430\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u0438 \u0432\u0441\u0435\u0445 \u0435\u0433\u043e <code>subview<\/code>. \u0415\u0441\u043b\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 (<code>pointIsInside == true<\/code>), \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u043e <code>subview<\/code> \u0442\u0430\u0431-\u0431\u0430\u0440\u0430. \u041f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 <code>UIResponderChain<\/code>, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 &#171;\u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439&#187; <code>subview<\/code>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430 \u043d\u0435\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043a\u0430\u0441\u0430\u043d\u0438\u044f, \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441 <code>MainTabBarController<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0435 <code>middleButton<\/code>:<\/p>\n<pre><code class=\"swift\">middleButton.addTarget(self, action: #selector(didPressMiddleButton), for: .touchUpInside)<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u0430 <code>addTarget(_:action:for:)<\/code>:<\/p>\n<ol>\n<li>\n<p><code>target<\/code> \u2013 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443;<\/p>\n<\/li>\n<li>\n<p><code>action<\/code> \u2013 <code>selector<\/code> \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d;<\/p>\n<\/li>\n<li>\n<p><code>controlEvents<\/code> \u2013 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>MainTabBarController<\/code> \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>didPressMiddleButton()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e <code>tabBarItem<\/code> \u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0432\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>selector<\/code>, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a <code>@objc<\/code>:<\/p>\n<pre><code class=\"swift\">@objc private func didPressMiddleButton() { \tselectedIndex = 1 \tmiddleButton.backgroundColor = greenColor }<\/code><\/pre>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u043a\u0440\u0443\u0433\u043b\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.  <\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u043e \u0442\u0435\u043c\u0435  <\/h4>\n<ul>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uitabbarcontroller\">UITabBarController &#8212; \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/quartzcore\/cashapelayer\">CAShapeLayer &#8212; \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/touches_presses_and_gestures\/using_responders_and_the_responder_chain_to_handle_events\">Using Responders and the Responder Chain to Handle Events \u2013 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f <\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiresponder\">UIResponder \u2013 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiview\/1622469-hittest\">hitTest(_:with:) \u2013 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiview\/1622533-point\">point(inside:with:) \u2013 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiview\/1622424-convert\">convert(_:from:) \u2013 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uicontrol\/1618259-addtarget\">addTarget(_:action:for:) \u2013 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/medium.com\/yandex-maps-mobile\/%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC-%D1%83%D0%B4%D0%B0%D1%80-%D1%81-hittest-542653d51a8c\">\u0414\u0435\u0440\u0436\u0438\u043c \u0443\u0434\u0430\u0440 \u0441 hitTest<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/464463\/\">iOS Responder Chain \u0438\u043b\u0438 \u0427\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/simbirsoft\/blog\/550994\/\"> https:\/\/habr.com\/ru\/company\/simbirsoft\/blog\/550994\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! <\/p>\n<p>\u0414\u0438\u0437\u0430\u0439\u043d \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043b\u0438\u044f\u044f \u043d\u0430 \u0435\u0433\u043e \u0443\u0441\u043f\u0435\u0445. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0447\u0430\u0441\u0442\u043e \u043e\u0442\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c, \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u0430\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0432\u0437\u0433\u043b\u044f\u0434, \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f user retention (\u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439).<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432: \u0442\u0430\u0431-\u0431\u0430\u0440 \u0441 \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0439 \u0446\u0432\u0435\u0442 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u043d\u0435\u043c.<\/p>\n<h4>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p><code>UIKit<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u2013 <code>UITabBarController<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0441\u0442 \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u0437\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>ViewController<\/code>\u2019\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>tabBarItem.title<\/code> \u0438 <code>tabBarItem.image<\/code> \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>ViewController<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438, \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0430.<\/p>\n<h4>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 Xcode, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u0444\u0430\u0439\u043b <code>Main.storyboard <\/code> \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 <code>ViewController<\/code>. \u0412 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u0435\u043d\u044e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 <code>Editor -&gt; Embed In<\/code> \u0438 \u0432\u044b\u0431\u0435\u0440\u0435\u043c <code>Tab Bar Controller<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448 <code>ViewController<\/code> \u0432<code>TabBarController<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u043c <code>tabBarItem<\/code>. \u0412\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0434. \u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u0444\u0430\u0439\u043b <code>ViewController.swift<\/code> \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0432 <code>MainTabBarController<\/code>, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u0437\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0435\u0439 Command \u0438 \u0432\u044b\u0431\u0440\u0430\u0432 <code>Rename<\/code> \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e:  <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 <code>UITabBarController<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>UIViewController<\/code>:  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <code>Main.storyboard<\/code> \u0443 <code>TabBarController<\/code> \u0443\u043a\u0430\u0436\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>MainTabBarController<\/code>:  <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <code>MainTabBarController<\/code> \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 (\u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043e\u043d \u0440\u0430\u0432\u0435\u043d 42), \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u043e\u0432, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0430\u043c\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438:  <\/p>\n<pre><code class=\"swift\">private let middleButtonDiameter: CGFloat = 42  private let redColor: UIColor = UIColor(red: 254.0 \/ 255.0, green: 116.0 \/ 255.0, blue: 96.0 \/ 255.0, alpha: 1.0) private let greenColor: UIColor = UIColor(red: 102.0 \/ 255.0, green: 166.0 \/ 255.0, blue: 54.0 \/ 255.0, alpha: 1.0)  private lazy var middleButton: UIButton = { \tlet middleButton = UIButton() \tmiddleButton.layer.cornerRadius = middleButtonDiameter \/ 2 \tmiddleButton.backgroundColor = redColor \tmiddleButton.translatesAutoresizingMaskIntoConstraints = false \treturn middleButton }()<\/code><\/pre>\n<p>\u0421\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>layer.cornerRadius<\/code>. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0443\u0433\u043b\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 2.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c <code>UIImageView<\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u0435\u0440\u0434\u0446\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<pre><code class=\"swift\">private lazy var heartImageView: UIImageView = { \tlet heartImageView = UIImageView() \theartImageView.image = UIImage(systemName: \"heart.fill\") \theartImageView.tintColor = .white \theartImageView.translatesAutoresizingMaskIntoConstraints = false \treturn heartImageView }()<\/code><\/pre>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>makeUI()<\/code> \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:  <\/p>\n<pre><code class=\"swift\">private func makeUI() { \t\/\/ 1 \ttabBar.addSubview(middleButton) \tmiddleButton.addSubview(heartImageView)  \t\/\/ 2 \tNSLayoutConstraint.activate([ \t\t\/\/ 2.1 \t\tmiddleButton.heightAnchor.constraint(equalToConstant: middleButtonDiameter), \t\tmiddleButton.widthAnchor.constraint(equalToConstant: middleButtonDiameter), \t\t\/\/ 2.2 \t\tmiddleButton.centerXAnchor.constraint(equalTo: tabBar.centerXAnchor), \t\tmiddleButton.topAnchor.constraint(equalTo: tabBar.topAnchor, constant: -10) \t])  \t\/\/ 3 \tNSLayoutConstraint.activate([ \t\t\/\/ 3.1 \t\theartImageView.heightAnchor.constraint(equalToConstant: 15), \t\theartImageView.widthAnchor.constraint(equalToConstant: 18), \t\t\/\/ 3.2 \t\theartImageView.centerXAnchor.constraint(equalTo: middleButton.centerXAnchor), \t\theartImageView.centerYAnchor.constraint(equalTo: middleButton.centerYAnchor) \t]) }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<p>1. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>middleButton<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>subview<\/code> \u043d\u0430<code>tabBar<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 <code>heartImageView<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>subview<\/code> \u043d\u0430 <code>middleButton<\/code>;<\/p>\n<p>2. \u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0435\u0439\u043d\u0442\u044b \u0434\u043b\u044f <code>middleButton<\/code>:<\/p>\n<p>    2.1. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c;<\/p>\n<p>    2.2. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043d\u0442\u0440 \u043f\u043e \u043e\u0441\u0438 <code>x<\/code> \u0438 \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b: \u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043d\u0430\u0434 \u0442\u0430\u0431-\u0431\u0430\u0440\u043e\u043c \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<p>3. \u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0435\u0439\u043d\u0442\u044b \u0434\u043b\u044f <code>heartImageView<\/code>:<\/p>\n<p>    3.1. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c;<\/p>\n<p>    3.2. \u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0446\u0435\u043d\u0442\u0440 \u043f\u043e \u043e\u0441\u044f\u043c <code>x<\/code> \u0438 <code>y<\/code> \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f <code>heartImageView<\/code> \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 <code>middleButton<\/code>.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>makeUI()<\/code>&nbsp; \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>viewDidLoad()<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>MainTabBarController<\/code>:<\/p>\n<pre><code class=\"swift\">override func viewDidLoad() { \tsuper.viewDidLoad() \tmakeUI() }<\/code><\/pre>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442. \u0423 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 CAShapeLayer  <\/h4>\n<p>\u041f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u0432\u043e\u0434\u043a\u0430 \u043d\u0430\u0434 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0432 \u0444\u043e\u0440\u043c\u0435 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430. \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>CAShapeLayer<\/code>, \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430 <code>CALayer<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e <code>CustomTabBar.swift<\/code>, \u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u043c \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <code>UITabBar<\/code>: <\/p>\n<pre><code class=\"swift\">import UIKit  final class CustomTabBar: UITabBar {      }<\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <code>Main.storyboard<\/code> \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0442\u0430\u0431-\u0431\u0430\u0440 \u043d\u0430 <code>MainTabBarController<\/code> \u0438 \u0443\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>CustomTabBar<\/code>:  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>CustomTabBar<\/code> \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431-\u0431\u0430\u0440\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0434\u043b\u044f \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430 \u043e\u0431\u0432\u043e\u0434\u043a\u0438:<\/p>\n<pre><code class=\"swift\">private var tabBarWidth: CGFloat { self.bounds.width } private var tabBarHeight: CGFloat { self.bounds.height } private var centerWidth: CGFloat { self.bounds.width \/ 2 } private let circleRadius: CGFloat = 27<\/code><\/pre>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438\u0446 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>CGPath<\/code> \u2013 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0443\u0442\u044c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f, \u0440\u0438\u0441\u0443\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0443:<\/p>\n<pre><code class=\"swift\">private func shapePath() -&gt; CGPath { \tlet path = UIBezierPath() \/\/ 1 \tpath.move(to: CGPoint(x: 0, y: 0)) \/\/ 2 \tpath.addLine(to: CGPoint(x: tabBarWidth, y: 0)) \/\/ 3 \tpath.addLine(to: CGPoint(x: tabBarWidth, y: tabBarHeight)) \/\/ 4 \tpath.addLine(to: CGPoint(x: 0, y: tabBarHeight)) \/\/ 5 \tpath.close() \/\/ 6 \treturn path.cgPath \/\/ 7 }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>path<\/code> \u0442\u0438\u043f\u0430 <code>UIBezierPath<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0443 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u0443\u0433\u043b\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0443\u0433\u043b\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0435\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0443\u0433\u043b\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c, \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044f\u0441\u044c \u0438\u0437 \u0442\u043e\u0447\u043a\u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>CGPath<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>CGPath<\/code> \u0434\u043b\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430:<\/p>\n<pre><code class=\"swift\">private func circlePath() -&gt; CGPath { \tlet path = UIBezierPath() \/\/ 1 \tpath.addArc(withCenter: CGPoint(x: centerWidth, y: 12), \/\/ 2 \t\t\t\tradius: circleRadius, \/\/ 3 \t\t\t\tstartAngle: 180 * .pi \/ 180, \/\/ 4 \t\t\t\tendAngle: 0 * 180 \/ .pi, \/\/ 5 \t\t\t\tclockwise: true) \/\/ 6 \treturn path.cgPath \/\/ 7 }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>path<\/code> \u0442\u0438\u043f\u0430 <code>UIBezierPath<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>addArc<\/code>, \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430. \u042d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430 \u043f\u043e \u043e\u0441\u0438 <code>x<\/code> \u0438 \u0441 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u043c \u0432\u043d\u0438\u0437 \u043d\u0430 12 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u043e \u043e\u0441\u0438 <code>y<\/code> (\u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043d\u0430\u0434 \u0442\u0430\u0431-\u0431\u0430\u0440\u043e\u043c \u043d\u0430 15 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439).<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0434\u0438\u0443\u0441 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0433\u043e\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0443\u0433\u043e\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430 \u2013 \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>CGPath<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>drawTabBar()<\/code>, \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0432 \u0434\u0432\u0430 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u0443\u0435\u043c\u044b\u0445 <code>CALayer<\/code>:  <\/p>\n<pre><code class=\"swift\">private var shapeLayer: CALayer? private var circleLayer: CALayer?<\/code><\/pre>\n<pre><code class=\"swift\">private func drawTabBar() { \t\/\/ 1 \tlet shapeLayer = CAShapeLayer() \tshapeLayer.path = shapePath() \tshapeLayer.strokeColor = UIColor.lightGray.cgColor \tshapeLayer.fillColor = UIColor.white.cgColor \tshapeLayer.lineWidth = 1.0  \t\/\/ 2 \tlet circleLayer = CAShapeLayer() \tcircleLayer.path = circlePath() \tcircleLayer.strokeColor = UIColor.lightGray.cgColor \tcircleLayer.fillColor = UIColor.white.cgColor \tcircleLayer.lineWidth = 1.0          \t\/\/ 3 \tif let oldShapeLayer = self.shapeLayer { \t\tself.layer.replaceSublayer(oldShapeLayer, with: shapeLayer) \t} else if let oldShapeLayer = self.circleLayer { \t\tself.layer.replaceSublayer(oldShapeLayer, with: circleLayer) \t} else { \t\tself.layer.insertSublayer(shapeLayer, at: 0) \t\tself.layer.insertSublayer(circleLayer, at: 1) \t}  \t\/\/ 4 \tself.shapeLayer = shapeLayer \tself.circleLayer = circleLayer }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b:<\/p>\n<ol>\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>shapeLayer<\/code> \u0442\u0438\u043f\u0430 <code>CAShapeLayer<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043f\u043e \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0443 \u0442\u0430\u0431-\u0431\u0430\u0440\u0430. \u0423 \u043d\u0435\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c, \u0446\u0432\u0435\u0442 \u043e\u0431\u0432\u043e\u0434\u043a\u0438, \u0446\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 <code>circleLayer<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>CAShapeLayer,<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u044f \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u043f\u043e\u043b\u0443\u043a\u0440\u0443\u0433\u0430. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0440\u0430\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u0434\u0430, \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2013 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 <code>insertSublayer<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 <code>draw(_:)<\/code> \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"swift\">override func draw(_ rect: CGRect) { \tdrawTabBar() }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441 <code>MainTabBarController<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 \u043c\u0435\u0442\u043e\u0434 <code>makeUI()<\/code>:  <\/p>\n<pre><code class=\"swift\">\/\/ 1 let firstVC = UIViewController() firstVC.view.backgroundColor = .yellow firstVC.tabBarItem.title = \"First VC\" firstVC.tabBarItem.image = UIImage(systemName: \"1.circle\")  \/\/ 2 let middleVC = UIViewController() middleVC.view.backgroundColor = .green middleVC.tabBarItem.title = \"Middle VC\"  \/\/ 3 let secondVC = UIViewController() secondVC.view.backgroundColor = .blue secondVC.tabBarItem.title = \"Second VC\" secondVC.tabBarItem.image = UIImage(systemName: \"2.circle\")  \/\/ 4 viewControllers = [firstVC, middleVC, secondVC]<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <code>ViewController<\/code>\u2019\u043e\u0432, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u043d\u0438\u0445 <code>backgroundColor<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u0431-\u0431\u0430\u0440\u0435, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>ViewController<\/code>\u2019\u043e\u0432 \u043d\u0430\u0448\u0435\u0433\u043e <code>UITabBarController<\/code>.<\/p>\n<p>\u0421\u043a<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-321037","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/321037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=321037"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/321037\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=321037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=321037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=321037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}