From e80ef7d3f4116d7792049e2003a74af4818c9449 Mon Sep 17 00:00:00 2001 From: Jeff Menter Date: Sun, 31 Mar 2019 09:45:23 -0500 Subject: [PATCH] improved ui --- Pixelizer.xcodeproj/project.pbxproj | 6 ++++ Pixelizer/.DS_Store | Bin 6148 -> 0 bytes Pixelizer/Base.lproj/Main.storyboard | 43 ++++++++++++++++----------- Pixelizer/BoxesScene.m | 25 ++++++++-------- Pixelizer/LabeledSlider.h | 11 +++++++ Pixelizer/LabeledSlider.m | 39 ++++++++++++++++++++++++ Pixelizer/ViewController.m | 17 +++++++---- 7 files changed, 105 insertions(+), 36 deletions(-) delete mode 100644 Pixelizer/.DS_Store create mode 100644 Pixelizer/LabeledSlider.h create mode 100644 Pixelizer/LabeledSlider.m diff --git a/Pixelizer.xcodeproj/project.pbxproj b/Pixelizer.xcodeproj/project.pbxproj index fd20984..94901f4 100644 --- a/Pixelizer.xcodeproj/project.pbxproj +++ b/Pixelizer.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 630BFD36225103AD00C430A8 /* LabeledSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 630BFD35225103AD00C430A8 /* LabeledSlider.m */; }; 6378EC0721A7122F0071B6A8 /* BoxesScene.m in Sources */ = {isa = PBXBuildFile; fileRef = 6378EC0521A7122F0071B6A8 /* BoxesScene.m */; }; 6378EC4721A712B70071B6A8 /* cpSpace.c in Sources */ = {isa = PBXBuildFile; fileRef = 6378EC0921A712B70071B6A8 /* cpSpace.c */; }; 6378EC4821A712B70071B6A8 /* cpSpaceStep.c in Sources */ = {isa = PBXBuildFile; fileRef = 6378EC0A21A712B70071B6A8 /* cpSpaceStep.c */; }; @@ -52,6 +53,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 630BFD34225103AD00C430A8 /* LabeledSlider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LabeledSlider.h; sourceTree = ""; }; + 630BFD35225103AD00C430A8 /* LabeledSlider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LabeledSlider.m; sourceTree = ""; }; 6378EC0521A7122F0071B6A8 /* BoxesScene.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BoxesScene.m; sourceTree = ""; }; 6378EC0621A7122F0071B6A8 /* BoxesScene.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BoxesScene.h; sourceTree = ""; }; 6378EC0921A712B70071B6A8 /* cpSpace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cpSpace.c; sourceTree = ""; }; @@ -236,6 +239,8 @@ 6378EC0821A712B70071B6A8 /* chipmunk */, 63815F6321A6216700AEAE77 /* AppDelegate.h */, 63815F6421A6216700AEAE77 /* AppDelegate.m */, + 630BFD34225103AD00C430A8 /* LabeledSlider.h */, + 630BFD35225103AD00C430A8 /* LabeledSlider.m */, 63815F6621A6216700AEAE77 /* ViewController.h */, 63815F6721A6216700AEAE77 /* ViewController.m */, 6378EC0621A7122F0071B6A8 /* BoxesScene.h */, @@ -357,6 +362,7 @@ 6378EC5321A712B70071B6A8 /* cpPinJoint.c in Sources */, 6378EC6621A712B70071B6A8 /* cpHastySpace.c in Sources */, 6378EC5D21A712B70071B6A8 /* cpConstraint.c in Sources */, + 630BFD36225103AD00C430A8 /* LabeledSlider.m in Sources */, 6378EC5021A712B70071B6A8 /* cpSweep1D.c in Sources */, 6378EC6521A712B70071B6A8 /* cpSlideJoint.c in Sources */, 6378EC6221A712B70071B6A8 /* cpRotaryLimitJoint.c in Sources */, diff --git a/Pixelizer/.DS_Store b/Pixelizer/.DS_Store deleted file mode 100644 index 158fd742a3d04ae7b01023dde6038aa7893b77d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Sr=55Ukc50v^oK<9vbOAB-XSg8YD@;zc4DBOdqUcjeQpeh^qTf)_7R4c#@< z+cm@1VS5{ZE%%Q%zyiRW?uaiBQ}gHU6FaMn5$QbR9Xnj(6A!qbRG&^b_Y$|{?eH|> zA2T1Dx9!X8_Bn4keT=eFKnh3!DIf);z%Lc>-bLiOI;@5dtDCJR6pPz=ev5Kg zPgIlwQedpWd2Scp|JU>%=KnECJ1HOq{*?kYTWwZLzEbtp$;)}KZS*_3*Bt0>TnB|A m+A%TOF*n|huc9dHny>l17Y>O*XFlje{S3G+GAZ!a3VZ_zju%$| diff --git a/Pixelizer/Base.lproj/Main.storyboard b/Pixelizer/Base.lproj/Main.storyboard index b15dbd4..8149e65 100644 --- a/Pixelizer/Base.lproj/Main.storyboard +++ b/Pixelizer/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - + - + @@ -21,50 +21,57 @@ - + - - + + - + + + + + + + + - + - - - - + - + + - - + + - - + + + + - - + + diff --git a/Pixelizer/BoxesScene.m b/Pixelizer/BoxesScene.m index 766800d..1453bd4 100644 --- a/Pixelizer/BoxesScene.m +++ b/Pixelizer/BoxesScene.m @@ -53,6 +53,8 @@ - (void)createPhysicsWorld; - (void)createSceneContents; { + CGFloat verticalOffset = 94; + CGFloat horizontalMargin = 16; CGImageRef image = self.image.CGImage; size_t width = CGImageGetWidth(image); size_t height = CGImageGetHeight(image); @@ -61,24 +63,22 @@ - (void)createSceneContents; CFDataRef rawData = CGDataProviderCopyData(CGImageGetDataProvider(image)); UInt8 *imageBuffer = (UInt8 *)CFDataGetBytePtr(rawData); - CGFloat boxWidth = (self.size.width - 16) / width; - CGFloat pixelWidth = (self.size.width - 16) / width; + CGFloat boxWidth = (self.size.width - horizontalMargin * 2) / width; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - NSInteger pixelIndex = (width * y) + x * components; - UInt8 pixelComponentB = imageBuffer[pixelIndex]; - UInt8 pixelComponentG = imageBuffer[pixelIndex + 1]; - UInt8 pixelComponentR = imageBuffer[pixelIndex + 2]; - UIColor *color = [UIColor colorWithRed:pixelComponentR / 255.f - green:pixelComponentG / 255.f - blue:pixelComponentB / 255.f alpha:1]; + NSInteger index = (x + (width * y)) * components; + UInt8 pixelComponentB = imageBuffer[index]; + UInt8 pixelComponentG = imageBuffer[index + 1]; + UInt8 pixelComponentR = imageBuffer[index + 2]; + UIColor *color = [UIColor colorWithRed:pixelComponentR / 255.f green:pixelComponentG / 255.f blue:pixelComponentB / 255.f alpha:1]; CGSize boxSize = CGSizeMake(boxWidth, boxWidth); SKAssignableSpriteNode *spriteNode = [SKAssignableSpriteNode shapeWithColor:color size:boxSize circular:_circles]; spriteNode.pixelXPosition = x; spriteNode.pixelYPosition = y; - spriteNode.position = CGPointMake( (x * pixelWidth) + 16, self.view.bounds.size.height - 58 - (y * pixelWidth)); + spriteNode.position = CGPointMake((x * boxWidth) + 16, + self.view.bounds.size.height - verticalOffset - (y * boxWidth)); spriteNode.mass = (pixelComponentG / 25.f) + 1; [self addChild:spriteNode]; cpFloat moment; @@ -135,8 +135,9 @@ - (void)update:(NSTimeInterval)currentTime; UInt8 pixelComponent = buffer[pixelIndex]; UInt8 pixelComponent2 = buffer[pixelIndex + 1]; UInt8 pixelComponent3 = buffer[pixelIndex + 2]; - UIColor *color = [UIColor colorWithRed:pixelComponent3 / 255.f green:pixelComponent2 / 255.f blue:pixelComponent / 255.f alpha:1]; - + UIColor *color = [UIColor colorWithRed:pixelComponent3 / 255.f + green:pixelComponent2 / 255.f + blue:pixelComponent / 255.f alpha:1]; if (useCircles) { node.texture = [SKTexture circleTextureWithColor:color size:node.size]; } else { diff --git a/Pixelizer/LabeledSlider.h b/Pixelizer/LabeledSlider.h new file mode 100644 index 0000000..3dc84c7 --- /dev/null +++ b/Pixelizer/LabeledSlider.h @@ -0,0 +1,11 @@ + +@import UIKit; + +@interface LabeledSlider : UISlider + +@property (nonatomic) UILabel *label; + +- (NSString *)labelText; +- (UIColor *)labelTextColor; + +@end diff --git a/Pixelizer/LabeledSlider.m b/Pixelizer/LabeledSlider.m new file mode 100644 index 0000000..d8f29a4 --- /dev/null +++ b/Pixelizer/LabeledSlider.m @@ -0,0 +1,39 @@ + +#import "LabeledSlider.h" + +@implementation LabeledSlider + +- (instancetype)initWithCoder:(NSCoder *)aDecoder; +{ + if (!(self = [super initWithCoder:aDecoder])) return nil; + + self.label = UILabel.new; + self.label.textAlignment = NSTextAlignmentCenter; + self.label.font = [UIFont fontWithName:@"AvenirNextCondensed-Medium" size:17.f]; + self.label.adjustsFontSizeToFitWidth = YES; + self.label.baselineAdjustment = UIBaselineAdjustmentAlignCenters; + [self addSubview:self.label]; + + return self; +} + +- (void)layoutSubviews; +{ + [super layoutSubviews]; + [self bringSubviewToFront:self.label]; + self.label.frame = CGRectInset([self thumbRectForBounds:self.bounds trackRect:[self trackRectForBounds:self.bounds] value:self.value], 4.f, 0.f); + self.label.text = self.labelText; + self.label.textColor = self.labelTextColor; +} + +- (NSString *)labelText; +{ + return [NSString stringWithFormat:@"%i", (int)roundf(self.value)]; +} + +- (UIColor *)labelTextColor; +{ + return UIColor.darkGrayColor; +} + +@end diff --git a/Pixelizer/ViewController.m b/Pixelizer/ViewController.m index 8299753..7fc1a27 100644 --- a/Pixelizer/ViewController.m +++ b/Pixelizer/ViewController.m @@ -10,8 +10,8 @@ @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @property (weak, nonatomic) IBOutlet UISlider *slider; -@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentedControl; -@property (weak, nonatomic) IBOutlet UISwitch *liveColor; +@property (weak, nonatomic) IBOutlet UISegmentedControl *shapeControl; +@property (weak, nonatomic) IBOutlet UISegmentedControl *liveControl; @property (weak, nonatomic) IBOutlet SKView *skView; @property (nonatomic) AVCaptureSession *session; @@ -66,21 +66,26 @@ - (void)skViewTap:(UITapGestureRecognizer *)tapGR; if (self.device) { [self.session startRunning]; } self.imageView.hidden = NO; self.skView.hidden = YES; + self.slider.enabled = YES; + self.shapeControl.enabled = YES; + [self.skView presentScene:[SKScene.alloc initWithSize:CGSizeZero]]; } - (void)imageViewTap:(UITapGestureRecognizer *)tapGR; { - if (!self.liveColor.on) { + if (!self.liveControl.selectedSegmentIndex) { [self.session stopRunning]; } BoxesScene *scene = [BoxesScene.alloc initWithSize:self.skView.bounds.size image:self.imageView.image - circles:self.segmentedControl.selectedSegmentIndex == 1]; - scene.liveColor = self.liveColor.on; + circles:self.shapeControl.selectedSegmentIndex == 1]; + scene.liveColor = self.liveControl.selectedSegmentIndex; [self.skView presentScene:scene]; self.skView.hidden = NO; self.imageView.hidden = YES; + self.slider.enabled = NO; + self.shapeControl.enabled = NO; } - (void)captureOutput:(AVCaptureOutput *)captureOutput @@ -115,7 +120,7 @@ - (void)processImage:(UIImage *)image; [image drawInRect:scaledImageRect]; UIImage *scaledImage = [UIImage imageWithCGImage:UIGraphicsGetImageFromCurrentImageContext().CGImage]; self.imageView.image = scaledImage; - if (self.liveColor.on && !self.skView.hidden) { + if (self.liveControl.selectedSegmentIndex && !self.skView.hidden) { ((BoxesScene *)self.skView.scene).image = scaledImage; } }