@@ -11,36 +11,64 @@ import UIKit
11
11
class ViewController : UIViewController {
12
12
private let emojiLabel : UILabel = {
13
13
let this = UILabel ( )
14
- this. translatesAutoresizingMaskIntoConstraints = false
15
14
this. font = . systemFont( ofSize: 64 )
16
15
this. text = " 🎉 "
17
16
return this
18
17
} ( )
19
- private let confettiView : ConfettiView = {
20
- let images = ( 1 ... 7 ) . compactMap { UIImage ( named : " confetti \( $0 ) " ) }
21
- let this = ConfettiView ( images : images )
18
+ private var confettiView : ConfettiView ?
19
+ private let segmentedControl : UISegmentedControl = {
20
+ let this = UISegmentedControl ( )
22
21
this. translatesAutoresizingMaskIntoConstraints = false
22
+ this. insertSegment ( withTitle: " Top to Bottom " , at: 0 , animated: false )
23
+ this. insertSegment ( withTitle: " Center to Left " , at: 1 , animated: false )
24
+ this. selectedSegmentIndex = 0
23
25
return this
24
26
} ( )
25
27
26
28
override func viewDidLoad( ) {
27
29
super. viewDidLoad ( )
28
30
view. backgroundColor = . systemBackground
29
31
view. addSubview ( emojiLabel)
30
- view. addSubview ( confettiView )
31
- NSLayoutConstraint . activate ( [
32
- emojiLabel . centerXAnchor . constraint ( equalTo : view . centerXAnchor ) ,
33
- emojiLabel . centerYAnchor . constraint ( equalTo : view . centerYAnchor ) ,
32
+ view. addSubview ( segmentedControl )
33
+ segmentedControl . addTarget ( self , action : #selector ( segmentedControlValueChanged ) , for : . valueChanged )
34
+ setupConfettiView ( with : . topToBottom )
35
+ }
34
36
35
- confettiView. leadingAnchor. constraint ( equalTo: view. leadingAnchor) ,
36
- confettiView. trailingAnchor. constraint ( equalTo: view. trailingAnchor) ,
37
- confettiView. topAnchor. constraint ( equalTo: view. topAnchor) ,
38
- confettiView. bottomAnchor. constraint ( equalTo: view. bottomAnchor)
39
- ] )
37
+ override func viewDidLayoutSubviews( ) {
38
+ super. viewDidLayoutSubviews ( )
39
+ let emojiLabelSize = emojiLabel. intrinsicContentSize
40
+ let emojiLabelOrigin = CGPoint ( x: ( view. frame. width - emojiLabelSize. width) / 2 , y: ( view. frame. height - emojiLabelSize. height) / 2 )
41
+ emojiLabel. frame = CGRect ( origin: emojiLabelOrigin, size: emojiLabelSize)
42
+ confettiView? . frame = view. bounds
43
+ let segmentedControlSize = segmentedControl. intrinsicContentSize
44
+ let segmentedControlOriginX = ( view. frame. width - segmentedControlSize. width) / 2
45
+ let segmentedControlOriginY = view. frame. height - view. safeAreaInsets. bottom - segmentedControlSize. height - 30
46
+ let segmentedControlOrigin = CGPoint ( x: segmentedControlOriginX, y: segmentedControlOriginY)
47
+ segmentedControl. frame = CGRect ( origin: segmentedControlOrigin, size: segmentedControlSize)
40
48
}
41
49
42
50
override func touchesEnded( _ touches: Set < UITouch > , with event: UIEvent ? ) {
43
51
super. touchesEnded ( touches, with: event)
44
- confettiView. shoot ( )
52
+ confettiView? . shoot ( )
53
+ }
54
+ }
55
+
56
+ private extension ViewController {
57
+ private func setupConfettiView( with mode: ConfettiMode ) {
58
+ confettiView? . removeFromSuperview ( )
59
+ let images = ( 1 ... 7 ) . compactMap { UIImage ( named: " confetti \( $0) " ) }
60
+ let confettiView = ConfettiView ( mode: mode, images: images)
61
+ confettiView. isUserInteractionEnabled = false
62
+ view. addSubview ( confettiView)
63
+ self . confettiView = confettiView
64
+ view. setNeedsLayout ( )
65
+ }
66
+
67
+ @objc private func segmentedControlValueChanged( ) {
68
+ if segmentedControl. selectedSegmentIndex == 0 {
69
+ setupConfettiView ( with: . topToBottom)
70
+ } else if segmentedControl. selectedSegmentIndex == 1 {
71
+ setupConfettiView ( with: . centerToLeft)
72
+ }
45
73
}
46
74
}
0 commit comments