Skip to content

Commit a42e0af

Browse files
committed
Optimization for magnifier
1 parent 0fe0fa3 commit a42e0af

File tree

6 files changed

+37
-31
lines changed

6 files changed

+37
-31
lines changed

ArtOfAscii/Modules/BookCore.playgroundmodule/Sources/UserInterface/Chapters/01-ArtOfAscii/02-HowImagesComposed/HowImagesComposedLiveViewController.swift

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class HowImagesComposedViewController: BaseViewController {
4545
send(payload.playgroundValue)
4646
}
4747

48-
private func repositionMagnifier(centerInImageView: CGPoint) {
48+
private func updateMagnificationCenter(centerInImageView: CGPoint) {
4949
if let centerInImage = self.showcaseImageView.pointInImageFor(point: centerInImageView) {
5050
magnifierContainerView.magnificationCenter = centerInImage
5151
}
@@ -55,20 +55,21 @@ public class HowImagesComposedViewController: BaseViewController {
5555
magnifierContainerView.isHidden = magnifierButton.state == .normal
5656
}
5757

58-
override func didSelectImage(image: UIImage, pickerController: ImagePickerViewController) {
59-
super.didSelectImage(image: image, pickerController: pickerController)
60-
requestImageFiltering()
61-
}
62-
6358
override func updateShowcaseImage(image: UIImage) {
6459
super.updateShowcaseImage(image: image)
6560

6661
magnifierContainerView.image = image
6762
if magnifierContainerView.magnificationCenter == nil {
68-
repositionMagnifier(centerInImageView: showcaseImageView.center)
63+
updateMagnificationCenter(centerInImageView: showcaseImageView.center)
6964
}
7065
}
7166

67+
override func didSelectImage(image: UIImage, pickerController: ImagePickerViewController) {
68+
super.didSelectImage(image: image, pickerController: pickerController)
69+
magnifierContainerView.resetMagnifierPosition(animated: true)
70+
requestImageFiltering()
71+
}
72+
7273
override func toolBarButtonTapped(buttonView: ToolBarButtonView) {
7374
switch buttonView {
7475
case magnifierButton:
@@ -82,9 +83,9 @@ public class HowImagesComposedViewController: BaseViewController {
8283

8384
extension HowImagesComposedViewController: MagnifierContainerViewDelegate {
8485

85-
func magnificationCenterChanged(point: CGPoint, containerView: MagnifierContainerView) {
86+
func magnifierCenterPositionChanged(point: CGPoint, containerView: MagnifierContainerView) {
8687
let centerInImageView = self.showcaseImageView.convert(point, from: containerView)
87-
repositionMagnifier(centerInImageView: centerInImageView)
88+
updateMagnificationCenter(centerInImageView: centerInImageView)
8889
}
8990

9091
}

ArtOfAscii/Modules/BookCore.playgroundmodule/Sources/UserInterface/Chapters/01-ArtOfAscii/02-HowImagesComposed/Views/MagnifierView.swift

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,20 @@ class MagnifierView: UIView {
3636
}
3737

3838
override func draw(_ rect: CGRect) {
39-
guard
40-
let center = magnificationCenter,
41-
let rawImage = rawImage else {
39+
guard let center = magnificationCenter,
40+
let rawImage = rawImage,
41+
let context = UIGraphicsGetCurrentContext() else {
4242
return
4343
}
4444

45-
let croppingRect = CGRect(origin: center, size: CGSize(width: samplePixels, height: samplePixels))
46-
47-
guard let context = UIGraphicsGetCurrentContext() else {
48-
return
49-
}
45+
let samplingRect = CGRect(origin: center, size: CGSize(width: samplePixels, height: samplePixels))
5046

5147
let pixelSize = Int(min(self.bounds.width / CGFloat(samplePixels), self.bounds.height / CGFloat(samplePixels)))
5248

5349
for y in 0..<samplePixels {
5450
for x in 0..<samplePixels {
55-
let ix = x + Int(croppingRect.minX)
56-
let iy = y + Int(croppingRect.minY)
51+
let ix = x + Int(samplingRect.minX)
52+
let iy = y + Int(samplingRect.minY)
5753

5854
var pixel = rawImage.pixelAt(x: ix, y: iy)
5955
let pixelColor: UIColor = pixel?.uiColor ?? .black

ArtOfAscii/Modules/BookCore.playgroundmodule/Sources/UserInterface/Chapters/01-ArtOfAscii/02-HowImagesComposed/Views/MagnivierContainerView.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,24 @@ class MagnifierContainerView: UIView {
4242
override func layoutSubviews() {
4343
super.layoutSubviews()
4444

45-
magnifierView.transform = .identity
46-
delegate?.magnificationCenterChanged(point: self.center, containerView: self)
45+
resetMagnifierPosition(animated: true)
46+
delegate?.magnifierCenterPositionChanged(point: self.center, containerView: self)
4747
}
4848

49-
@objc func panGestureAction(_ sender: UIPanGestureRecognizer) {
49+
func resetMagnifierPosition(animated: Bool) {
50+
UIView.animate(withDuration: animated ? 0.2 : 0, animations: {
51+
self.magnifierView.center = self.center
52+
}, completion: { _ in
53+
self.delegate?.magnifierCenterPositionChanged(point: self.center, containerView: self)
54+
})
55+
}
56+
57+
@objc private func panGestureAction(_ sender: UIPanGestureRecognizer) {
5058
let translation = sender.translation(in: self)
5159
let newCenter = CGPoint(x: magnifierView.center.x + translation.x, y: magnifierView.center.y + translation.y)
5260
if self.bounds.contains(newCenter) {
5361
magnifierView.center = newCenter
54-
delegate?.magnificationCenterChanged(point: newCenter, containerView: self)
62+
delegate?.magnifierCenterPositionChanged(point: newCenter, containerView: self)
5563
}
5664
sender.setTranslation(CGPoint.zero, in: self)
5765
}
@@ -60,6 +68,6 @@ class MagnifierContainerView: UIView {
6068

6169
protocol MagnifierContainerViewDelegate: AnyObject {
6270

63-
func magnificationCenterChanged(point: CGPoint, containerView: MagnifierContainerView)
71+
func magnifierCenterPositionChanged(point: CGPoint, containerView: MagnifierContainerView)
6472

6573
}

ArtOfAscii/Modules/BookCore.playgroundmodule/Sources/UserInterface/ShowcaseImageView/ShowcaseImageView.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ShowcaseImageView: UIImageView {
5252
}
5353
if image.size.height < self.bounds.size.height {
5454
drawingRect.size.height = image.size.height
55-
drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2
55+
drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2
5656
}
5757
return drawingRect
5858
default:
@@ -68,13 +68,15 @@ class ShowcaseImageView: UIImageView {
6868

6969
func pointInImageFor(point: CGPoint) -> CGPoint? {
7070
guard let imageSize = self.image?.size,
71-
let drawingRect = self.drawingRect,
72-
drawingRect.contains(point) else {
71+
let drawingRect = self.drawingRect else {
7372
return nil
7473
}
7574

76-
let pointInScaledImage = CGPoint(x: point.x - drawingRect.minX, y: point.y - drawingRect.minY)
77-
let pointInImage = CGPoint(x: pointInScaledImage.x * (imageSize.width / drawingRect.width),
75+
let pointInScaledImage = CGPoint(
76+
x: point.x - drawingRect.minX,
77+
y: point.y - drawingRect.minY)
78+
let pointInImage = CGPoint(
79+
x: pointInScaledImage.x * (imageSize.width / drawingRect.width),
7880
y: pointInScaledImage.y * (imageSize.height / drawingRect.height))
7981
return pointInImage
8082
}

ArtOfAscii/PrivateResources/LiveView.storyboard

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,6 @@
678678
</connections>
679679
</view>
680680
</subviews>
681-
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
682681
<constraints>
683682
<constraint firstItem="gIr-Sj-FWJ" firstAttribute="top" secondItem="s4T-su-e8Q" secondAttribute="topMargin" id="2da-Xn-9Ko"/>
684683
<constraint firstAttribute="trailingMargin" secondItem="gIr-Sj-FWJ" secondAttribute="trailing" id="I9E-57-HzM"/>

LiveViewTestApp/AppDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import BookCore
1414
class AppDelegate: LiveViewHost.AppDelegate {
1515

1616
override func setUpLiveView() -> PlaygroundLiveViewable {
17-
return BookCore.instantiateLiveView(identifier: .introduction)
17+
return BookCore.instantiateLiveView(identifier: .howImagesComposed)
1818
}
1919

2020
override var liveViewConfiguration: LiveViewConfiguration {

0 commit comments

Comments
 (0)