[Libreoffice-commits] core.git: ios/iosremote

siqi me at siqi.fr
Mon Jul 15 11:07:40 PDT 2013


 ios/iosremote/ic_launcher.png                                                                   |binary
 ios/iosremote/ic_launcher at 2x.png                                                                |binary
 ios/iosremote/iosremote.xcodeproj/project.pbxproj                                               |   35 +
 ios/iosremote/iosremote.xcodeproj/xcuserdata/siqi.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist |   13 
 ios/iosremote/iosremote/Communication/Client.m                                                  |   21 -
 ios/iosremote/iosremote/Communication/SlideShow.m                                               |    5 
 ios/iosremote/iosremote/UIImage+Resize.m                                                        |  186 +++++++++
 ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.h                                      |   11 
 ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.m                                      |  127 ++++++
 ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.h                                     |   18 
 ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.m                                     |  188 ++++++++++
 ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.h                              |    9 
 ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.m                              |   58 +++
 ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard                                     |   51 --
 ios/iosremote/iosremote/iosremote-Info.plist                                                    |    4 
 ios/iosremote/iosremote/newServer_vc.m                                                          |    2 
 16 files changed, 660 insertions(+), 68 deletions(-)

New commits:
commit 71a80c52d73607384851da708735e4a48079fc62
Author: siqi <me at siqi.fr>
Date:   Mon Jul 15 20:07:03 2013 +0200

    UIImage categories used for load optimisation
    
    Change-Id: Icf31e42c9be1fb749da912a2b3c79822f16a49e5

diff --git a/ios/iosremote/ic_launcher.png b/ios/iosremote/ic_launcher.png
index 508d947..d39ebd1 100644
Binary files a/ios/iosremote/ic_launcher.png and b/ios/iosremote/ic_launcher.png differ
diff --git a/ios/iosremote/ic_launcher at 2x.png b/ios/iosremote/ic_launcher at 2x.png
index 6febfad..3333308 100644
Binary files a/ios/iosremote/ic_launcher at 2x.png and b/ios/iosremote/ic_launcher at 2x.png differ
diff --git a/ios/iosremote/iosremote.xcodeproj/project.pbxproj b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
index 539a83f..bba51b0 100644
--- a/ios/iosremote/iosremote.xcodeproj/project.pbxproj
+++ b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
@@ -11,6 +11,9 @@
 		5711026D1794127E007D343B /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 571102691794127E007D343B /* README.md */; };
 		5711026E1794127E007D343B /* release_notes.md in Resources */ = {isa = PBXBuildFile; fileRef = 5711026A1794127E007D343B /* release_notes.md */; };
 		571102701794128E007D343B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5711026F1794128E007D343B /* libz.dylib */; };
+		5711027B17946186007D343B /* UIImage+Alpha.m in Sources */ = {isa = PBXBuildFile; fileRef = 5711027617946185007D343B /* UIImage+Alpha.m */; };
+		5711027C17946186007D343B /* UIImage+Resize.m in Sources */ = {isa = PBXBuildFile; fileRef = 5711027817946186007D343B /* UIImage+Resize.m */; };
+		5711027D17946186007D343B /* UIImage+RoundedCorner.m in Sources */ = {isa = PBXBuildFile; fileRef = 5711027A17946186007D343B /* UIImage+RoundedCorner.m */; };
 		571BFAD1178AADA200EF1BDB /* more_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 571BFAD0178AADA200EF1BDB /* more_icon.png */; };
 		571D4807178B2F080063D93B /* timer_clear_btn.png in Resources */ = {isa = PBXBuildFile; fileRef = 571D4805178B2F080063D93B /* timer_clear_btn.png */; };
 		571D4808178B2F080063D93B /* timer_start_btn.png in Resources */ = {isa = PBXBuildFile; fileRef = 571D4806178B2F080063D93B /* timer_start_btn.png */; };
@@ -65,6 +68,12 @@
 		5711026A1794127E007D343B /* release_notes.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = release_notes.md; sourceTree = "<group>"; };
 		5711026B1794127E007D343B /* TestFlight.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestFlight.h; sourceTree = "<group>"; };
 		5711026F1794128E007D343B /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
+		5711027517946185007D343B /* UIImage+Alpha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Alpha.h"; sourceTree = "<group>"; };
+		5711027617946185007D343B /* UIImage+Alpha.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Alpha.m"; sourceTree = "<group>"; };
+		5711027717946186007D343B /* UIImage+Resize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Resize.h"; sourceTree = "<group>"; };
+		5711027817946186007D343B /* UIImage+Resize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Resize.m"; sourceTree = "<group>"; };
+		5711027917946186007D343B /* UIImage+RoundedCorner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+RoundedCorner.h"; sourceTree = "<group>"; };
+		5711027A17946186007D343B /* UIImage+RoundedCorner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+RoundedCorner.m"; sourceTree = "<group>"; };
 		571BFAD0178AADA200EF1BDB /* more_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = more_icon.png; path = iosremote/more_icon.png; sourceTree = "<group>"; };
 		571D4805178B2F080063D93B /* timer_clear_btn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = timer_clear_btn.png; path = iosremote/timer_clear_btn.png; sourceTree = "<group>"; };
 		571D4806178B2F080063D93B /* timer_start_btn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = timer_start_btn.png; path = iosremote/timer_start_btn.png; sourceTree = "<group>"; };
@@ -165,6 +174,19 @@
 			path = TestFlightSDK1.2.6;
 			sourceTree = "<group>";
 		};
+		5711027417946185007D343B /* UIImage-categories */ = {
+			isa = PBXGroup;
+			children = (
+				5711027517946185007D343B /* UIImage+Alpha.h */,
+				5711027617946185007D343B /* UIImage+Alpha.m */,
+				5711027717946186007D343B /* UIImage+Resize.h */,
+				5711027817946186007D343B /* UIImage+Resize.m */,
+				5711027917946186007D343B /* UIImage+RoundedCorner.h */,
+				5711027A17946186007D343B /* UIImage+RoundedCorner.m */,
+			);
+			path = "UIImage-categories";
+			sourceTree = "<group>";
+		};
 		571BFAD2178AB7BA00EF1BDB /* slideShow */ = {
 			isa = PBXGroup;
 			children = (
@@ -277,6 +299,7 @@
 		57C6E3F9175E06E800E8BC5F /* Supporting Files */ = {
 			isa = PBXGroup;
 			children = (
+				5711027417946185007D343B /* UIImage-categories */,
 				57701736178AC83E00B99793 /* SWRevealViewController */,
 				57B152971764703500EECC67 /* Base64.h */,
 				57B152981764703500EECC67 /* Base64.m */,
@@ -428,6 +451,9 @@
 				57701742178B0A6900B99793 /* slideShowSwipeInList.m in Sources */,
 				57DC700F178E03330050FC58 /* touchPointer_vc.m in Sources */,
 				57DC7012178E16A40050FC58 /* UIViewTransitionCategory.m in Sources */,
+				5711027B17946186007D343B /* UIImage+Alpha.m in Sources */,
+				5711027C17946186007D343B /* UIImage+Resize.m in Sources */,
+				5711027D17946186007D343B /* UIImage+RoundedCorner.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -497,7 +523,8 @@
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				CODE_SIGN_IDENTITY = "iPhone Distribution";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
 				COPY_PHASE_STRIP = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
@@ -505,6 +532,8 @@
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
 				OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+				PROVISIONING_PROFILE = "";
+				"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VALIDATE_PRODUCT = YES;
@@ -517,7 +546,7 @@
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "iosremote/iosremote-Prefix.pch";
 				INFOPLIST_FILE = "iosremote/iosremote-Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"\"$(SRCROOT)/../../../../../../Downloads/TestFlightSDK1.2.6\"",
@@ -535,7 +564,7 @@
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "iosremote/iosremote-Prefix.pch";
 				INFOPLIST_FILE = "iosremote/iosremote-Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"\"$(SRCROOT)/../../../../../../Downloads/TestFlightSDK1.2.6\"",
diff --git a/ios/iosremote/iosremote.xcodeproj/xcuserdata/siqi.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ios/iosremote/iosremote.xcodeproj/xcuserdata/siqi.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
index f488c43..42f3f3f 100644
--- a/ios/iosremote/iosremote.xcodeproj/xcuserdata/siqi.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
+++ b/ios/iosremote/iosremote.xcodeproj/xcuserdata/siqi.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -29,5 +29,18 @@
          landmarkName = "-tableView:cellForRowAtIndexPath:"
          landmarkType = "5">
       </FileBreakpoint>
+      <FileBreakpoint
+         shouldBeEnabled = "No"
+         ignoreCount = "0"
+         continueAfterRunningActions = "No"
+         filePath = "iosremote/Communication/Client.m"
+         timestampString = "395603811.784147"
+         startingColumnNumber = "9223372036854775807"
+         endingColumnNumber = "9223372036854775807"
+         startingLineNumber = "122"
+         endingLineNumber = "122"
+         landmarkName = "-streamOpenWithIp:withPortNumber:"
+         landmarkType = "5">
+      </FileBreakpoint>
    </FileBreakpoints>
 </Bucket>
diff --git a/ios/iosremote/iosremote/Communication/Client.m b/ios/iosremote/iosremote/Communication/Client.m
index 1bdedf2..4416986 100644
--- a/ios/iosremote/iosremote/Communication/Client.m
+++ b/ios/iosremote/iosremote/Communication/Client.m
@@ -203,8 +203,12 @@ int count = 0;
                 }
             }
             //            NSLog(@"Command:%@", str);
-            NSArray *commands = [str componentsSeparatedByString:@"\n"];
-            [self.receiver parse:commands];
+            
+            backgroundQueue = dispatch_queue_create("com.libreoffice.iosremote", DISPATCH_QUEUE_CONCURRENT);
+            dispatch_async(backgroundQueue, ^(void) {
+                NSArray *commands = [str componentsSeparatedByString:@"\n"];
+                [self.receiver parse:commands];
+            });
             data = nil;
             str = nil;
         } break;
@@ -222,15 +226,16 @@ int count = 0;
         return;
     [self stopConnectionTimeoutTimer];
 //    NSLog(@"stream status i:%u o:%u", self.inputStream.streamStatus, self.outputStream.streamStatus);
-    if ([self.inputStream streamStatus] != NSStreamStatusClosed && [self.inputStream streamStatus] != NSStreamStatusError) {
+    if ([self.inputStream streamStatus] != NSStreamStatusClosed) {
 //        NSLog(@"ci");
         [self.inputStream close];
-    }
+    } else
+        [self.inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
     
-    if ([self.outputStream streamStatus] != NSStreamStatusClosed && [self.outputStream streamStatus] != NSStreamStatusError) {
-//        NSLog(@"co");
+    if ([self.outputStream streamStatus] != NSStreamStatusClosed) {
         [self.outputStream close];
-    }
+    } else
+        [self.outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
     self.inputStream = nil;
     self.outputStream = nil;
     self.connected = NO;
@@ -238,7 +243,7 @@ int count = 0;
 
 - (void) connect
 {
-    [self startConnectionTimeoutTimerwithInterval:3.0];
+    [self startConnectionTimeoutTimerwithInterval:5.0];
     backgroundQueue = dispatch_queue_create("com.libreoffice.iosremote", NULL);
     dispatch_async(backgroundQueue, ^(void) {
         [self streamOpenWithIp:self.server.serverAddress withPortNumber:self.mPort];
diff --git a/ios/iosremote/iosremote/Communication/SlideShow.m b/ios/iosremote/iosremote/Communication/SlideShow.m
index 8f890b8..8552311 100644
--- a/ios/iosremote/iosremote/Communication/SlideShow.m
+++ b/ios/iosremote/iosremote/Communication/SlideShow.m
@@ -10,6 +10,7 @@
 #import "SlideShow.h"
 #import "Base64.h"
 #import "slideShow_vc.h"
+#import "UIImage+Resize.h"
 #import <dispatch/dispatch.h>
 
 @interface SlideShow()
@@ -41,7 +42,7 @@ NSLock *dictLock;
     _size = 0;
     _currentSlide = 0;
     
-    backgroundQueue = dispatch_queue_create("org.libreoffice.iosremote.bgqueue", NULL);
+    backgroundQueue = dispatch_queue_create("org.libreoffice.iosremote.bgqueue", DISPATCH_QUEUE_CONCURRENT);
     NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
     
     /**
@@ -69,6 +70,7 @@ NSLock *dictLock;
                                                                   if ([view isKindOfClass:[UIImageView class]]){
                                                                       UIImage *image = [self.imagesDictionary objectForKey:[self.loadBuffer objectForKey:tag]];
                                                                       if (image) {
+                                                                          image = [image resizedImage:view.frame.size interpolationQuality:kCGInterpolationDefault];
                                                                           dispatch_async(dispatch_get_main_queue(), ^{
                                                                              [(UIImageView *)view setImage:image];
                                                                           });
@@ -88,6 +90,7 @@ NSLock *dictLock;
                                                                       UIImage *image = [self.imagesDictionary objectForKey:[self.loadBuffer objectForKey:tag]];
                                                                       if (image){
                                                                           UIImageView *imageView = (UIImageView *)[view viewWithTag:1];
+                                                                          image = [image resizedImage:imageView.frame.size interpolationQuality:kCGInterpolationDefault];
                                                                           dispatch_async(dispatch_get_main_queue(), ^{
                                                                               [imageView setImage:image];
                                                                           });
diff --git a/ios/iosremote/iosremote/UIImage+Resize.m b/ios/iosremote/iosremote/UIImage+Resize.m
new file mode 100644
index 0000000..beed236
--- /dev/null
+++ b/ios/iosremote/iosremote/UIImage+Resize.m
@@ -0,0 +1,186 @@
+// UIImage+Resize.m
+// Created by Trevor Harmon on 8/5/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+#import "UIImage+Resize.h"
+
+// Private helper methods
+ at interface UIImage ()
+- (UIImage *)resizedImage:(CGSize)newSize
+                transform:(CGAffineTransform)transform
+           drawTransposed:(BOOL)transpose
+     interpolationQuality:(CGInterpolationQuality)quality;
+- (CGAffineTransform)transformForOrientation:(CGSize)newSize;
+ at end
+
+ at implementation UIImage (Resize)
+
+// Returns a copy of this image that is cropped to the given bounds.
+// The bounds will be adjusted using CGRectIntegral.
+// This method ignores the image's imageOrientation setting.
+- (UIImage *)croppedImage:(CGRect)bounds {
+    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
+    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
+    CGImageRelease(imageRef);
+    return croppedImage;
+}
+
+// Returns a copy of this image that is squared to the thumbnail size.
+// If transparentBorder is non-zero, a transparent border of the given size will be added around the edges of the thumbnail. (Adding a transparent border of at least one pixel in size has the side-effect of antialiasing the edges of the image when rotating it using Core Animation.)
+- (UIImage *)thumbnailImage:(NSInteger)thumbnailSize
+          transparentBorder:(NSUInteger)borderSize
+               cornerRadius:(NSUInteger)cornerRadius
+       interpolationQuality:(CGInterpolationQuality)quality {
+    UIImage *resizedImage = [self resizedImageWithContentMode:UIViewContentModeScaleAspectFill
+                                                       bounds:CGSizeMake(thumbnailSize, thumbnailSize)
+                                         interpolationQuality:quality];
+    
+    // Crop out any part of the image that's larger than the thumbnail size
+    // The cropped rect must be centered on the resized image
+    // Round the origin points so that the size isn't altered when CGRectIntegral is later invoked
+    CGRect cropRect = CGRectMake(round((resizedImage.size.width - thumbnailSize) / 2),
+                                 round((resizedImage.size.height - thumbnailSize) / 2),
+                                 thumbnailSize,
+                                 thumbnailSize);
+    UIImage *croppedImage = [resizedImage croppedImage:cropRect];
+    
+    UIImage *transparentBorderImage = borderSize ? [croppedImage transparentBorderImage:borderSize] : croppedImage;
+    
+    return [transparentBorderImage roundedCornerImage:cornerRadius borderSize:borderSize];
+}
+
+// Returns a rescaled copy of the image, taking into account its orientation
+// The image will be scaled disproportionately if necessary to fit the bounds specified by the parameter
+- (UIImage *)resizedImage:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)quality {
+    BOOL drawTransposed;
+    
+    switch (self.imageOrientation) {
+        case UIImageOrientationLeft:
+        case UIImageOrientationLeftMirrored:
+        case UIImageOrientationRight:
+        case UIImageOrientationRightMirrored:
+            drawTransposed = YES;
+            break;
+            
+        default:
+            drawTransposed = NO;
+    }
+    
+    return [self resizedImage:newSize
+                    transform:[self transformForOrientation:newSize]
+               drawTransposed:drawTransposed
+         interpolationQuality:quality];
+}
+
+// Resizes the image according to the given content mode, taking into account the image's orientation
+- (UIImage *)resizedImageWithContentMode:(UIViewContentMode)contentMode
+                                  bounds:(CGSize)bounds
+                    interpolationQuality:(CGInterpolationQuality)quality {
+    CGFloat horizontalRatio = bounds.width / self.size.width;
+    CGFloat verticalRatio = bounds.height / self.size.height;
+    CGFloat ratio;
+    
+    switch (contentMode) {
+        case UIViewContentModeScaleAspectFill:
+            ratio = MAX(horizontalRatio, verticalRatio);
+            break;
+            
+        case UIViewContentModeScaleAspectFit:
+            ratio = MIN(horizontalRatio, verticalRatio);
+            break;
+            
+        default:
+            [NSException raise:NSInvalidArgumentException format:@"Unsupported content mode: %d", contentMode];
+    }
+    
+    CGSize newSize = CGSizeMake(self.size.width * ratio, self.size.height * ratio);
+    
+    return [self resizedImage:newSize interpolationQuality:quality];
+}
+
+#pragma mark -
+#pragma mark Private helper methods
+
+// Returns a copy of the image that has been transformed using the given affine transform and scaled to the new size
+// The new image's orientation will be UIImageOrientationUp, regardless of the current image's orientation
+// If the new size is not integral, it will be rounded up
+- (UIImage *)resizedImage:(CGSize)newSize
+                transform:(CGAffineTransform)transform
+           drawTransposed:(BOOL)transpose
+     interpolationQuality:(CGInterpolationQuality)quality {
+    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
+    CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width);
+    CGImageRef imageRef = self.CGImage;
+    
+    // Build a context that's the same dimensions as the new size
+    CGContextRef bitmap = CGBitmapContextCreate(NULL,
+                                                newRect.size.width,
+                                                newRect.size.height,
+                                                CGImageGetBitsPerComponent(imageRef),
+                                                0,
+                                                CGImageGetColorSpace(imageRef),
+                                                CGImageGetBitmapInfo(imageRef));
+    
+    // Rotate and/or flip the image if required by its orientation
+    CGContextConcatCTM(bitmap, transform);
+    
+    // Set the quality level to use when rescaling
+    CGContextSetInterpolationQuality(bitmap, quality);
+    
+    // Draw into the context; this scales the image
+    CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef);
+    
+    // Get the resized image from the context and a UIImage
+    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
+    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
+    
+    // Clean up
+    CGContextRelease(bitmap);
+    CGImageRelease(newImageRef);
+    
+    return newImage;
+}
+
+// Returns an affine transform that takes into account the image orientation when drawing a scaled image
+- (CGAffineTransform)transformForOrientation:(CGSize)newSize {
+    CGAffineTransform transform = CGAffineTransformIdentity;
+    
+    switch (self.imageOrientation) {
+        case UIImageOrientationDown:           // EXIF = 3
+        case UIImageOrientationDownMirrored:   // EXIF = 4
+            transform = CGAffineTransformTranslate(transform, newSize.width, newSize.height);
+            transform = CGAffineTransformRotate(transform, M_PI);
+            break;
+            
+        case UIImageOrientationLeft:           // EXIF = 6
+        case UIImageOrientationLeftMirrored:   // EXIF = 5
+            transform = CGAffineTransformTranslate(transform, newSize.width, 0);
+            transform = CGAffineTransformRotate(transform, M_PI_2);
+            break;
+            
+        case UIImageOrientationRight:          // EXIF = 8
+        case UIImageOrientationRightMirrored:  // EXIF = 7
+            transform = CGAffineTransformTranslate(transform, 0, newSize.height);
+            transform = CGAffineTransformRotate(transform, -M_PI_2);
+            break;
+    }
+    
+    switch (self.imageOrientation) {
+        case UIImageOrientationUpMirrored:     // EXIF = 2
+        case UIImageOrientationDownMirrored:   // EXIF = 4
+            transform = CGAffineTransformTranslate(transform, newSize.width, 0);
+            transform = CGAffineTransformScale(transform, -1, 1);
+            break;
+            
+        case UIImageOrientationLeftMirrored:   // EXIF = 5
+        case UIImageOrientationRightMirrored:  // EXIF = 7
+            transform = CGAffineTransformTranslate(transform, newSize.height, 0);
+            transform = CGAffineTransformScale(transform, -1, 1);
+            break;
+    }
+    
+    return transform;
+}
+
+ at end
\ No newline at end of file
diff --git a/ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.h b/ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.h
new file mode 100644
index 0000000..370d978
--- /dev/null
+++ b/ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.h
@@ -0,0 +1,11 @@
+// UIImage+Alpha.h
+// Created by Trevor Harmon on 9/20/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+// Helper methods for adding an alpha layer to an image
+ at interface UIImage (Alpha)
+- (BOOL)hasAlpha;
+- (UIImage *)imageWithAlpha;
+- (UIImage *)transparentBorderImage:(NSUInteger)borderSize;
+ at end
diff --git a/ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.m b/ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.m
new file mode 100644
index 0000000..d731062
--- /dev/null
+++ b/ios/iosremote/iosremote/UIImage-categories/UIImage+Alpha.m
@@ -0,0 +1,127 @@
+// UIImage+Alpha.m
+// Created by Trevor Harmon on 9/20/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+#import "UIImage+Alpha.h"
+
+// Private helper methods
+ at interface UIImage ()
+- (CGImageRef)newBorderMask:(NSUInteger)borderSize size:(CGSize)size;
+ at end
+
+ at implementation UIImage (Alpha)
+
+// Returns true if the image has an alpha layer
+- (BOOL)hasAlpha {
+    CGImageAlphaInfo alpha = CGImageGetAlphaInfo(self.CGImage);
+    return (alpha == kCGImageAlphaFirst ||
+            alpha == kCGImageAlphaLast ||
+            alpha == kCGImageAlphaPremultipliedFirst ||
+            alpha == kCGImageAlphaPremultipliedLast);
+}
+
+// Returns a copy of the given image, adding an alpha channel if it doesn't already have one
+- (UIImage *)imageWithAlpha {
+    if ([self hasAlpha]) {
+        return self;
+    }
+    
+    CGImageRef imageRef = self.CGImage;
+    size_t width = CGImageGetWidth(imageRef);
+    size_t height = CGImageGetHeight(imageRef);
+    
+    // The bitsPerComponent and bitmapInfo values are hard-coded to prevent an "unsupported parameter combination" error
+    CGContextRef offscreenContext = CGBitmapContextCreate(NULL,
+                                                          width,
+                                                          height,
+                                                          8,
+                                                          0,
+                                                          CGImageGetColorSpace(imageRef),
+                                                          kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
+    
+    // Draw the image into the context and retrieve the new image, which will now have an alpha layer
+    CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), imageRef);
+    CGImageRef imageRefWithAlpha = CGBitmapContextCreateImage(offscreenContext);
+    UIImage *imageWithAlpha = [UIImage imageWithCGImage:imageRefWithAlpha];
+    
+    // Clean up
+    CGContextRelease(offscreenContext);
+    CGImageRelease(imageRefWithAlpha);
+    
+    return imageWithAlpha;
+}
+
+// Returns a copy of the image with a transparent border of the given size added around its edges.
+// If the image has no alpha layer, one will be added to it.
+- (UIImage *)transparentBorderImage:(NSUInteger)borderSize {
+    // If the image does not have an alpha layer, add one
+    UIImage *image = [self imageWithAlpha];
+    
+    CGRect newRect = CGRectMake(0, 0, image.size.width + borderSize * 2, image.size.height + borderSize * 2);
+    
+    // Build a context that's the same dimensions as the new size
+    CGContextRef bitmap = CGBitmapContextCreate(NULL,
+                                                newRect.size.width,
+                                                newRect.size.height,
+                                                CGImageGetBitsPerComponent(self.CGImage),
+                                                0,
+                                                CGImageGetColorSpace(self.CGImage),
+                                                CGImageGetBitmapInfo(self.CGImage));
+    
+    // Draw the image in the center of the context, leaving a gap around the edges
+    CGRect imageLocation = CGRectMake(borderSize, borderSize, image.size.width, image.size.height);
+    CGContextDrawImage(bitmap, imageLocation, self.CGImage);
+    CGImageRef borderImageRef = CGBitmapContextCreateImage(bitmap);
+    
+    // Create a mask to make the border transparent, and combine it with the image
+    CGImageRef maskImageRef = [self newBorderMask:borderSize size:newRect.size];
+    CGImageRef transparentBorderImageRef = CGImageCreateWithMask(borderImageRef, maskImageRef);
+    UIImage *transparentBorderImage = [UIImage imageWithCGImage:transparentBorderImageRef];
+    
+    // Clean up
+    CGContextRelease(bitmap);
+    CGImageRelease(borderImageRef);
+    CGImageRelease(maskImageRef);
+    CGImageRelease(transparentBorderImageRef);
+    
+    return transparentBorderImage;
+}
+
+#pragma mark -
+#pragma mark Private helper methods
+
+// Creates a mask that makes the outer edges transparent and everything else opaque
+// The size must include the entire mask (opaque part + transparent border)
+// The caller is responsible for releasing the returned reference by calling CGImageRelease
+- (CGImageRef)newBorderMask:(NSUInteger)borderSize size:(CGSize)size {
+    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
+    
+    // Build a context that's the same dimensions as the new size
+    CGContextRef maskContext = CGBitmapContextCreate(NULL,
+                                                     size.width,
+                                                     size.height,
+                                                     8, // 8-bit grayscale
+                                                     0,
+                                                     colorSpace,
+                                                     kCGBitmapByteOrderDefault | kCGImageAlphaNone);
+    
+    // Start with a mask that's entirely transparent
+    CGContextSetFillColorWithColor(maskContext, [UIColor blackColor].CGColor);
+    CGContextFillRect(maskContext, CGRectMake(0, 0, size.width, size.height));
+    
+    // Make the inner part (within the border) opaque
+    CGContextSetFillColorWithColor(maskContext, [UIColor whiteColor].CGColor);
+    CGContextFillRect(maskContext, CGRectMake(borderSize, borderSize, size.width - borderSize * 2, size.height - borderSize * 2));
+    
+    // Get an image of the context
+    CGImageRef maskImageRef = CGBitmapContextCreateImage(maskContext);
+    
+    // Clean up
+    CGContextRelease(maskContext);
+    CGColorSpaceRelease(colorSpace);
+    
+    return maskImageRef;
+}
+
+ at end
diff --git a/ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.h b/ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.h
new file mode 100644
index 0000000..f143381
--- /dev/null
+++ b/ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.h
@@ -0,0 +1,18 @@
+// UIImage+Resize.h
+// Created by Trevor Harmon on 8/5/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+// Extends the UIImage class to support resizing/cropping
+ at interface UIImage (Resize)
+- (UIImage *)croppedImage:(CGRect)bounds;
+- (UIImage *)thumbnailImage:(NSInteger)thumbnailSize
+          transparentBorder:(NSUInteger)borderSize
+               cornerRadius:(NSUInteger)cornerRadius
+       interpolationQuality:(CGInterpolationQuality)quality;
+- (UIImage *)resizedImage:(CGSize)newSize
+     interpolationQuality:(CGInterpolationQuality)quality;
+- (UIImage *)resizedImageWithContentMode:(UIViewContentMode)contentMode
+                                  bounds:(CGSize)bounds
+                    interpolationQuality:(CGInterpolationQuality)quality;
+ at end
diff --git a/ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.m b/ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.m
new file mode 100644
index 0000000..1295610
--- /dev/null
+++ b/ios/iosremote/iosremote/UIImage-categories/UIImage+Resize.m
@@ -0,0 +1,188 @@
+// UIImage+Resize.m
+// Created by Trevor Harmon on 8/5/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+#import "UIImage+Resize.h"
+#import "UIImage+RoundedCorner.h"
+#import "UIImage+Alpha.h"
+
+// Private helper methods
+ at interface UIImage ()
+- (UIImage *)resizedImage:(CGSize)newSize
+                transform:(CGAffineTransform)transform
+           drawTransposed:(BOOL)transpose
+     interpolationQuality:(CGInterpolationQuality)quality;
+- (CGAffineTransform)transformForOrientation:(CGSize)newSize;
+ at end
+
+ at implementation UIImage (Resize)
+
+// Returns a copy of this image that is cropped to the given bounds.
+// The bounds will be adjusted using CGRectIntegral.
+// This method ignores the image's imageOrientation setting.
+- (UIImage *)croppedImage:(CGRect)bounds {
+    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
+    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
+    CGImageRelease(imageRef);
+    return croppedImage;
+}
+
+// Returns a copy of this image that is squared to the thumbnail size.
+// If transparentBorder is non-zero, a transparent border of the given size will be added around the edges of the thumbnail. (Adding a transparent border of at least one pixel in size has the side-effect of antialiasing the edges of the image when rotating it using Core Animation.)
+- (UIImage *)thumbnailImage:(NSInteger)thumbnailSize
+          transparentBorder:(NSUInteger)borderSize
+               cornerRadius:(NSUInteger)cornerRadius
+       interpolationQuality:(CGInterpolationQuality)quality {
+    UIImage *resizedImage = [self resizedImageWithContentMode:UIViewContentModeScaleAspectFill
+                                                       bounds:CGSizeMake(thumbnailSize, thumbnailSize)
+                                         interpolationQuality:quality];
+    
+    // Crop out any part of the image that's larger than the thumbnail size
+    // The cropped rect must be centered on the resized image
+    // Round the origin points so that the size isn't altered when CGRectIntegral is later invoked
+    CGRect cropRect = CGRectMake(round((resizedImage.size.width - thumbnailSize) / 2),
+                                 round((resizedImage.size.height - thumbnailSize) / 2),
+                                 thumbnailSize,
+                                 thumbnailSize);
+    UIImage *croppedImage = [resizedImage croppedImage:cropRect];
+    
+    UIImage *transparentBorderImage = borderSize ? [croppedImage transparentBorderImage:borderSize] : croppedImage;
+
+    return [transparentBorderImage roundedCornerImage:cornerRadius borderSize:borderSize];
+}
+
+// Returns a rescaled copy of the image, taking into account its orientation
+// The image will be scaled disproportionately if necessary to fit the bounds specified by the parameter
+- (UIImage *)resizedImage:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)quality {
+    BOOL drawTransposed;
+    
+    switch (self.imageOrientation) {
+        case UIImageOrientationLeft:
+        case UIImageOrientationLeftMirrored:
+        case UIImageOrientationRight:
+        case UIImageOrientationRightMirrored:
+            drawTransposed = YES;
+            break;
+            
+        default:
+            drawTransposed = NO;
+    }
+    
+    return [self resizedImage:newSize
+                    transform:[self transformForOrientation:newSize]
+               drawTransposed:drawTransposed
+         interpolationQuality:quality];
+}
+
+// Resizes the image according to the given content mode, taking into account the image's orientation
+- (UIImage *)resizedImageWithContentMode:(UIViewContentMode)contentMode
+                                  bounds:(CGSize)bounds
+                    interpolationQuality:(CGInterpolationQuality)quality {
+    CGFloat horizontalRatio = bounds.width / self.size.width;
+    CGFloat verticalRatio = bounds.height / self.size.height;
+    CGFloat ratio;
+    
+    switch (contentMode) {
+        case UIViewContentModeScaleAspectFill:
+            ratio = MAX(horizontalRatio, verticalRatio);
+            break;
+            
+        case UIViewContentModeScaleAspectFit:
+            ratio = MIN(horizontalRatio, verticalRatio);
+            break;
+            
+        default:
+            [NSException raise:NSInvalidArgumentException format:@"Unsupported content mode: %d", contentMode];
+    }
+    
+    CGSize newSize = CGSizeMake(self.size.width * ratio, self.size.height * ratio);
+    
+    return [self resizedImage:newSize interpolationQuality:quality];
+}
+
+#pragma mark -
+#pragma mark Private helper methods
+
+// Returns a copy of the image that has been transformed using the given affine transform and scaled to the new size
+// The new image's orientation will be UIImageOrientationUp, regardless of the current image's orientation
+// If the new size is not integral, it will be rounded up
+- (UIImage *)resizedImage:(CGSize)newSize
+                transform:(CGAffineTransform)transform
+           drawTransposed:(BOOL)transpose
+     interpolationQuality:(CGInterpolationQuality)quality {
+    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
+    CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width);
+    CGImageRef imageRef = self.CGImage;
+    
+    // Build a context that's the same dimensions as the new size
+    CGContextRef bitmap = CGBitmapContextCreate(NULL,
+                                                newRect.size.width,
+                                                newRect.size.height,
+                                                CGImageGetBitsPerComponent(imageRef),
+                                                0,
+                                                CGImageGetColorSpace(imageRef),
+                                                CGImageGetBitmapInfo(imageRef));
+    
+    // Rotate and/or flip the image if required by its orientation
+    CGContextConcatCTM(bitmap, transform);
+    
+    // Set the quality level to use when rescaling
+    CGContextSetInterpolationQuality(bitmap, quality);
+    
+    // Draw into the context; this scales the image
+    CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef);
+    
+    // Get the resized image from the context and a UIImage
+    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
+    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
+    
+    // Clean up
+    CGContextRelease(bitmap);
+    CGImageRelease(newImageRef);
+    
+    return newImage;
+}
+
+// Returns an affine transform that takes into account the image orientation when drawing a scaled image
+- (CGAffineTransform)transformForOrientation:(CGSize)newSize {
+    CGAffineTransform transform = CGAffineTransformIdentity;
+    
+    switch (self.imageOrientation) {
+        case UIImageOrientationDown:           // EXIF = 3
+        case UIImageOrientationDownMirrored:   // EXIF = 4
+            transform = CGAffineTransformTranslate(transform, newSize.width, newSize.height);
+            transform = CGAffineTransformRotate(transform, M_PI);
+            break;
+            
+        case UIImageOrientationLeft:           // EXIF = 6
+        case UIImageOrientationLeftMirrored:   // EXIF = 5
+            transform = CGAffineTransformTranslate(transform, newSize.width, 0);
+            transform = CGAffineTransformRotate(transform, M_PI_2);
+            break;
+            
+        case UIImageOrientationRight:          // EXIF = 8
+        case UIImageOrientationRightMirrored:  // EXIF = 7
+            transform = CGAffineTransformTranslate(transform, 0, newSize.height);
+            transform = CGAffineTransformRotate(transform, -M_PI_2);
+            break;
+    }
+    
+    switch (self.imageOrientation) {
+        case UIImageOrientationUpMirrored:     // EXIF = 2
+        case UIImageOrientationDownMirrored:   // EXIF = 4
+            transform = CGAffineTransformTranslate(transform, newSize.width, 0);
+            transform = CGAffineTransformScale(transform, -1, 1);
+            break;
+            
+        case UIImageOrientationLeftMirrored:   // EXIF = 5
+        case UIImageOrientationRightMirrored:  // EXIF = 7
+            transform = CGAffineTransformTranslate(transform, newSize.height, 0);
+            transform = CGAffineTransformScale(transform, -1, 1);
+            break;
+    }
+    
+    return transform;
+}
+
+ at end
diff --git a/ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.h b/ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.h
new file mode 100644
index 0000000..630ebb3
--- /dev/null
+++ b/ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.h
@@ -0,0 +1,9 @@
+// UIImage+RoundedCorner.h
+// Created by Trevor Harmon on 9/20/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+// Extends the UIImage class to support making rounded corners
+ at interface UIImage (RoundedCorner)
+- (UIImage *)roundedCornerImage:(NSInteger)cornerSize borderSize:(NSInteger)borderSize;
+ at end
diff --git a/ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.m b/ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.m
new file mode 100644
index 0000000..6967540
--- /dev/null
+++ b/ios/iosremote/iosremote/UIImage-categories/UIImage+RoundedCorner.m
@@ -0,0 +1,58 @@
+// UIImage+RoundedCorner.m
+// Created by Trevor Harmon on 9/20/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+#import "UIImage+RoundedCorner.h"
+#import "UIImage+Alpha.h"
+
+// Private helper methods
+ at interface UIImage ()
+- (void)addRoundedRectToPath:(CGRect)rect context:(CGContextRef)context ovalWidth:(CGFloat)ovalWidth ovalHeight:(CGFloat)ovalHeight;
+ at end
+
+ at implementation UIImage (RoundedCorner)
+
+// Creates a copy of this image with rounded corners
+// If borderSize is non-zero, a transparent border of the given size will also be added
+// Original author: Björn Sållarp. Used with permission. See: http://blog.sallarp.com/iphone-uiimage-round-corners/
+- (UIImage *)roundedCornerImage:(NSInteger)cornerSize borderSize:(NSInteger)borderSize {
+    // If the image does not have an alpha layer, add one
+    UIImage *image = [self imageWithAlpha];
+    
+    // Build a context that's the same dimensions as the new size
+    CGContextRef context = CGBitmapContextCreate(NULL,
+                                                 image.size.width,
+                                                 image.size.height,
+                                                 CGImageGetBitsPerComponent(image.CGImage),
+                                                 0,
+                                                 CGImageGetColorSpace(image.CGImage),
+                                                 CGImageGetBitmapInfo(image.CGImage));
+
+    // Create a clipping path with rounded corners
+    CGContextBeginPath(context);
+    [self addRoundedRectToPath:CGRectMake(borderSize, borderSize, image.size.width - borderSize * 2, image.size.height - borderSize * 2)
+                       context:context
+                     ovalWidth:cornerSize
+                    ovalHeight:cornerSize];
+    CGContextClosePath(context);
+    CGContextClip(context);
+
+    // Draw the image to the context; the clipping path will make anything outside the rounded rect transparent
+    CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
+    
+    // Create a CGImage from the context
+    CGImageRef clippedImage = CGBitmapContextCreateImage(context);
+    CGContextRelease(context);
+    
+    // Create a UIImage from the CGImage
+    UIImage *roundedImage = [UIImage imageWithCGImage:clippedImage];
+    CGImageRelease(clippedImage);
+    
+    return roundedImage;
+}
+
+#pragma mark -
+#pragma mark Private helper methods
+
+ at end
diff --git a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
index 9e5f891..c43204c 100644
--- a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
+++ b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
@@ -427,49 +427,6 @@
             </objects>
             <point key="canvasLocation" x="2290" y="1807"/>
         </scene>
-        <!--Touch Pointer vc-->
-        <scene sceneID="lb3-jJ-4Di">
-            <objects>
-                <viewController id="hES-Cx-oSf" customClass="touchPointer_vc" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="5Hd-U9-nNh">
-                        <rect key="frame" x="0.0" y="20" width="320" height="548"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                        <subviews>
-                            <view contentMode="scaleToFill" id="mRz-Gd-KLu">
-                                <rect key="frame" x="-20" y="-20" width="360" height="588"/>
-                                <subviews>
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="wNe-aT-xcf">
-                                        <rect key="frame" x="73" y="493" width="214" height="44"/>
-                                        <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
-                                        <state key="normal" title="Back">
-                                            <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
-                                            <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
-                                        </state>
-                                        <state key="highlighted">
-                                            <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
-                                        </state>
-                                        <connections>
-                                            <action selector="dismissModal:" destination="hES-Cx-oSf" eventType="touchUpInside" id="tXy-a7-aOT"/>
-                                        </connections>
-                                    </button>
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" verticalCompressionResistancePriority="1000" id="yBi-pu-DQa">
-                                        <rect key="frame" x="20" y="129" width="320" height="242"/>
-                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
-                                    </imageView>
-                                </subviews>
-                                <color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
-                            </view>
-                        </subviews>
-                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
-                    </view>
-                    <connections>
-                        <outlet property="imageView" destination="yBi-pu-DQa" id="XE8-h0-pu0"/>
-                    </connections>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="gog-t4-scM" userLabel="First Responder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="2807" y="1752"/>
-        </scene>
         <!--Slide Show Preview Table vc-->
         <scene sceneID="Tvi-bD-vMC">
             <objects>
@@ -627,7 +584,6 @@
         <class className="slideShowPreviewTable_vc" superclassName="UITableViewController">
             <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowPreviewTable_vc.h"/>
             <relationships>
-                <relationship kind="action" name="startPresentationAction:"/>
                 <relationship kind="outlet" name="optionsTable" candidateClass="UITableView"/>
             </relationships>
         </class>
@@ -659,13 +615,6 @@
                 <relationship kind="outlet" name="touchPointerScrollView" candidateClass="UIScrollView"/>
             </relationships>
         </class>
-        <class className="touchPointer_vc" superclassName="UIViewController">
-            <source key="sourceIdentifier" type="project" relativePath="./Classes/touchPointer_vc.h"/>
-            <relationships>
-                <relationship kind="action" name="dismissModal:"/>
-                <relationship kind="outlet" name="imageView" candidateClass="UIImageView"/>
-            </relationships>
-        </class>
     </classes>
     <simulatedMetricsContainer key="defaultSimulatedMetrics">
         <simulatedStatusBarMetrics key="statusBar"/>
diff --git a/ios/iosremote/iosremote/iosremote-Info.plist b/ios/iosremote/iosremote/iosremote-Info.plist
index 578325c..59dcb6f 100644
--- a/ios/iosremote/iosremote/iosremote-Info.plist
+++ b/ios/iosremote/iosremote/iosremote-Info.plist
@@ -17,8 +17,6 @@
 				<string>ic_launcher.png</string>
 				<string>ic_launcher at 2x.png</string>
 			</array>
-			<key>UIPrerenderedIcon</key>
-			<true/>
 		</dict>
 	</dict>
 	<key>CFBundleIdentifier</key>
@@ -39,8 +37,6 @@
 	<true/>
 	<key>UIMainStoryboardFile</key>
 	<string>iPhone_autoSize</string>
-	<key>UIPrerenderedIcon</key>
-	<true/>
 	<key>UIRequiredDeviceCapabilities</key>
 	<array>
 		<string>armv7</string>
diff --git a/ios/iosremote/iosremote/newServer_vc.m b/ios/iosremote/iosremote/newServer_vc.m
index acd887e..65a3846 100644
--- a/ios/iosremote/iosremote/newServer_vc.m
+++ b/ios/iosremote/iosremote/newServer_vc.m
@@ -185,7 +185,7 @@
     EditableTableViewCell *cell = nil;
     NSString *text = nil;
     NSString *placeholder = nil;
-    UIKeyboardType keyboardType;
+    UIKeyboardType keyboardType = UIKeyboardTypeDefault;
     
     //  Pick the editable cell and the values for its textField
     //


More information about the Libreoffice-commits mailing list