mirror of
https://github.com/samsonjs/samhuri.net-ios.git
synced 2026-04-27 15:07:44 +00:00
Merge branch 'iOS-9'
This commit is contained in:
commit
c0ad4ab4fc
444 changed files with 4092 additions and 41035 deletions
|
|
@ -17,6 +17,7 @@
|
||||||
1BCFCB7B50DAE4885AE55B80 /* MuseoSans-100.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1BCFCC3154DB1D3B3C025211 /* MuseoSans-100.otf */; };
|
1BCFCB7B50DAE4885AE55B80 /* MuseoSans-100.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1BCFCC3154DB1D3B3C025211 /* MuseoSans-100.otf */; };
|
||||||
1BCFCC3709A3C3783E180815 /* ChangeTitleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCFCE26B630D546311BB715 /* ChangeTitleViewController.m */; };
|
1BCFCC3709A3C3783E180815 /* ChangeTitleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCFCE26B630D546311BB715 /* ChangeTitleViewController.m */; };
|
||||||
1BCFCC637C63C780248D685E /* PostCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCFCB5C36F301B2B93F8069 /* PostCell.m */; };
|
1BCFCC637C63C780248D685E /* PostCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCFCB5C36F301B2B93F8069 /* PostCell.m */; };
|
||||||
|
1BCFCD56F7850C9BDF8261AC /* BlogSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCFC1C7E02F4D1867A5D711 /* BlogSplitViewController.m */; };
|
||||||
1BCFCD747F327FC361469D49 /* MuseoSans-100-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1BCFCB67571197A762B88624 /* MuseoSans-100-Italic.otf */; };
|
1BCFCD747F327FC361469D49 /* MuseoSans-100-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1BCFCB67571197A762B88624 /* MuseoSans-100-Italic.otf */; };
|
||||||
1BCFCD7E8EEBFAA97226B0BF /* UIColor+Hex.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCFC23988387A5CAE551C90 /* UIColor+Hex.m */; };
|
1BCFCD7E8EEBFAA97226B0BF /* UIColor+Hex.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCFC23988387A5CAE551C90 /* UIColor+Hex.m */; };
|
||||||
1BCFCE976D6638781FBA9942 /* MuseoSans-700.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1BCFC462F5540C67B9D97299 /* MuseoSans-700.otf */; };
|
1BCFCE976D6638781FBA9942 /* MuseoSans-700.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1BCFC462F5540C67B9D97299 /* MuseoSans-700.otf */; };
|
||||||
|
|
@ -54,6 +55,7 @@
|
||||||
7B9E64421A22F3840072FF42 /* BlogService.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9E64411A22F3840072FF42 /* BlogService.m */; };
|
7B9E64421A22F3840072FF42 /* BlogService.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9E64411A22F3840072FF42 /* BlogService.m */; };
|
||||||
7B9E644C1A230B940072FF42 /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9E644B1A230B940072FF42 /* JSONHTTPClient.m */; };
|
7B9E644C1A230B940072FF42 /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9E644B1A230B940072FF42 /* JSONHTTPClient.m */; };
|
||||||
7B9E644F1A23129B0072FF42 /* BlogStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9E644E1A23129B0072FF42 /* BlogStatus.m */; };
|
7B9E644F1A23129B0072FF42 /* BlogStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9E644E1A23129B0072FF42 /* BlogStatus.m */; };
|
||||||
|
7BBA86971B4264AB00FD2320 /* NotificationToSelectorMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BBA86961B4264AB00FD2320 /* NotificationToSelectorMap.m */; };
|
||||||
7BE3A0351AE461E700E45CCB /* PreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BE3A0341AE461E700E45CCB /* PreviewViewController.m */; };
|
7BE3A0351AE461E700E45CCB /* PreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BE3A0341AE461E700E45CCB /* PreviewViewController.m */; };
|
||||||
7BF029331A27117200E42EDE /* ModelStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BF029321A27117200E42EDE /* ModelStore.m */; };
|
7BF029331A27117200E42EDE /* ModelStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BF029321A27117200E42EDE /* ModelStore.m */; };
|
||||||
7BF029381A280CB200E42EDE /* BlogController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BF029371A280CB200E42EDE /* BlogController.m */; };
|
7BF029381A280CB200E42EDE /* BlogController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BF029371A280CB200E42EDE /* BlogController.m */; };
|
||||||
|
|
@ -98,6 +100,7 @@
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
1613DC56A86AFA7E50460A37 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
1613DC56A86AFA7E50460A37 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
1BCFC0549FB7723D8893A91C /* ExtensionItemProcessor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExtensionItemProcessor.m; sourceTree = "<group>"; };
|
1BCFC0549FB7723D8893A91C /* ExtensionItemProcessor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExtensionItemProcessor.m; sourceTree = "<group>"; };
|
||||||
|
1BCFC1C7E02F4D1867A5D711 /* BlogSplitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlogSplitViewController.m; sourceTree = "<group>"; };
|
||||||
1BCFC23988387A5CAE551C90 /* UIColor+Hex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Hex.m"; sourceTree = "<group>"; };
|
1BCFC23988387A5CAE551C90 /* UIColor+Hex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Hex.m"; sourceTree = "<group>"; };
|
||||||
1BCFC27DA8A32D0484C273A0 /* ExtensionItemProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExtensionItemProcessor.h; sourceTree = "<group>"; };
|
1BCFC27DA8A32D0484C273A0 /* ExtensionItemProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExtensionItemProcessor.h; sourceTree = "<group>"; };
|
||||||
1BCFC32EC1E5AE196D194D21 /* CommonUI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonUI.m; sourceTree = "<group>"; };
|
1BCFC32EC1E5AE196D194D21 /* CommonUI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonUI.m; sourceTree = "<group>"; };
|
||||||
|
|
@ -105,6 +108,7 @@
|
||||||
1BCFC3B62AA92DB07923F7C1 /* PostCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PostCollection.m; sourceTree = "<group>"; };
|
1BCFC3B62AA92DB07923F7C1 /* PostCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PostCollection.m; sourceTree = "<group>"; };
|
||||||
1BCFC40D1BFCFBF04BC79A35 /* MuseoSans-900.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; path = "MuseoSans-900.otf"; sourceTree = "<group>"; };
|
1BCFC40D1BFCFBF04BC79A35 /* MuseoSans-900.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; path = "MuseoSans-900.otf"; sourceTree = "<group>"; };
|
||||||
1BCFC462F5540C67B9D97299 /* MuseoSans-700.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; path = "MuseoSans-700.otf"; sourceTree = "<group>"; };
|
1BCFC462F5540C67B9D97299 /* MuseoSans-700.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; path = "MuseoSans-700.otf"; sourceTree = "<group>"; };
|
||||||
|
1BCFC63F2FE2EFBC1C513859 /* BlogSplitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlogSplitViewController.h; sourceTree = "<group>"; };
|
||||||
1BCFC7FD826AC4789F946BC9 /* MuseoSans-900-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; path = "MuseoSans-900-Italic.otf"; sourceTree = "<group>"; };
|
1BCFC7FD826AC4789F946BC9 /* MuseoSans-900-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; path = "MuseoSans-900-Italic.otf"; sourceTree = "<group>"; };
|
||||||
1BCFCA73B716677EFBCEC417 /* CommonUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonUI.h; sourceTree = "<group>"; };
|
1BCFCA73B716677EFBCEC417 /* CommonUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonUI.h; sourceTree = "<group>"; };
|
||||||
1BCFCB18C8C8304D67E6462E /* PostCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PostCollection.h; sourceTree = "<group>"; };
|
1BCFCB18C8C8304D67E6462E /* PostCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PostCollection.h; sourceTree = "<group>"; };
|
||||||
|
|
@ -163,6 +167,8 @@
|
||||||
7B9E644B1A230B940072FF42 /* JSONHTTPClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONHTTPClient.m; sourceTree = "<group>"; };
|
7B9E644B1A230B940072FF42 /* JSONHTTPClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONHTTPClient.m; sourceTree = "<group>"; };
|
||||||
7B9E644D1A23129B0072FF42 /* BlogStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlogStatus.h; sourceTree = "<group>"; };
|
7B9E644D1A23129B0072FF42 /* BlogStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlogStatus.h; sourceTree = "<group>"; };
|
||||||
7B9E644E1A23129B0072FF42 /* BlogStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlogStatus.m; sourceTree = "<group>"; };
|
7B9E644E1A23129B0072FF42 /* BlogStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlogStatus.m; sourceTree = "<group>"; };
|
||||||
|
7BBA86951B4264AB00FD2320 /* NotificationToSelectorMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotificationToSelectorMap.h; sourceTree = "<group>"; };
|
||||||
|
7BBA86961B4264AB00FD2320 /* NotificationToSelectorMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotificationToSelectorMap.m; sourceTree = "<group>"; };
|
||||||
7BE3A0331AE461E700E45CCB /* PreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreviewViewController.h; sourceTree = "<group>"; };
|
7BE3A0331AE461E700E45CCB /* PreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreviewViewController.h; sourceTree = "<group>"; };
|
||||||
7BE3A0341AE461E700E45CCB /* PreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreviewViewController.m; sourceTree = "<group>"; };
|
7BE3A0341AE461E700E45CCB /* PreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreviewViewController.m; sourceTree = "<group>"; };
|
||||||
7BF029311A27117200E42EDE /* ModelStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModelStore.h; sourceTree = "<group>"; };
|
7BF029311A27117200E42EDE /* ModelStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModelStore.h; sourceTree = "<group>"; };
|
||||||
|
|
@ -295,6 +301,8 @@
|
||||||
7BF029351A27119B00E42EDE /* Service */,
|
7BF029351A27119B00E42EDE /* Service */,
|
||||||
7B5C4BE019F2606900667D48 /* AppDelegate.h */,
|
7B5C4BE019F2606900667D48 /* AppDelegate.h */,
|
||||||
7B5C4BE119F2606900667D48 /* AppDelegate.m */,
|
7B5C4BE119F2606900667D48 /* AppDelegate.m */,
|
||||||
|
1BCFC1C7E02F4D1867A5D711 /* BlogSplitViewController.m */,
|
||||||
|
1BCFC63F2FE2EFBC1C513859 /* BlogSplitViewController.h */,
|
||||||
7B5C4BE319F2606900667D48 /* PostsViewController.h */,
|
7B5C4BE319F2606900667D48 /* PostsViewController.h */,
|
||||||
7B5C4BE419F2606900667D48 /* PostsViewController.m */,
|
7B5C4BE419F2606900667D48 /* PostsViewController.m */,
|
||||||
7B5C4BE619F2606900667D48 /* EditorViewController.h */,
|
7B5C4BE619F2606900667D48 /* EditorViewController.h */,
|
||||||
|
|
@ -316,6 +324,8 @@
|
||||||
7B2B43501AED5BA500BAC4E2 /* Functions.m */,
|
7B2B43501AED5BA500BAC4E2 /* Functions.m */,
|
||||||
1BCFC32EC1E5AE196D194D21 /* CommonUI.m */,
|
1BCFC32EC1E5AE196D194D21 /* CommonUI.m */,
|
||||||
1BCFCA73B716677EFBCEC417 /* CommonUI.h */,
|
1BCFCA73B716677EFBCEC417 /* CommonUI.h */,
|
||||||
|
7BBA86951B4264AB00FD2320 /* NotificationToSelectorMap.h */,
|
||||||
|
7BBA86961B4264AB00FD2320 /* NotificationToSelectorMap.m */,
|
||||||
);
|
);
|
||||||
path = Blog;
|
path = Blog;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -469,7 +479,7 @@
|
||||||
7B5C4BD119F2606900667D48 /* Project object */ = {
|
7B5C4BD119F2606900667D48 /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 0600;
|
LastUpgradeCheck = 0700;
|
||||||
ORGANIZATIONNAME = "Guru Logic Inc.";
|
ORGANIZATIONNAME = "Guru Logic Inc.";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
7B08B3E61AF9CAD300435579 = {
|
7B08B3E61AF9CAD300435579 = {
|
||||||
|
|
@ -674,6 +684,7 @@
|
||||||
7B9E642E1A227FA20072FF42 /* NSString+marshmallows.m in Sources */,
|
7B9E642E1A227FA20072FF42 /* NSString+marshmallows.m in Sources */,
|
||||||
7B9E64421A22F3840072FF42 /* BlogService.m in Sources */,
|
7B9E64421A22F3840072FF42 /* BlogService.m in Sources */,
|
||||||
7B5C4BDF19F2606900667D48 /* main.m in Sources */,
|
7B5C4BDF19F2606900667D48 /* main.m in Sources */,
|
||||||
|
7BBA86971B4264AB00FD2320 /* NotificationToSelectorMap.m in Sources */,
|
||||||
7BF029331A27117200E42EDE /* ModelStore.m in Sources */,
|
7BF029331A27117200E42EDE /* ModelStore.m in Sources */,
|
||||||
7B2B43511AED5BA500BAC4E2 /* Functions.m in Sources */,
|
7B2B43511AED5BA500BAC4E2 /* Functions.m in Sources */,
|
||||||
7BF029381A280CB200E42EDE /* BlogController.m in Sources */,
|
7BF029381A280CB200E42EDE /* BlogController.m in Sources */,
|
||||||
|
|
@ -685,6 +696,7 @@
|
||||||
1BCFCF6DB93786CC2EDB8F69 /* PostCollection.m in Sources */,
|
1BCFCF6DB93786CC2EDB8F69 /* PostCollection.m in Sources */,
|
||||||
1BCFCC3709A3C3783E180815 /* ChangeTitleViewController.m in Sources */,
|
1BCFCC3709A3C3783E180815 /* ChangeTitleViewController.m in Sources */,
|
||||||
1BCFC7C3FCBF364F3239C3D4 /* CommonUI.m in Sources */,
|
1BCFC7C3FCBF364F3239C3D4 /* CommonUI.m in Sources */,
|
||||||
|
1BCFCD56F7850C9BDF8261AC /* BlogSplitViewController.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -745,6 +757,7 @@
|
||||||
INFOPLIST_FILE = samhuri.net/Info.plist;
|
INFOPLIST_FILE = samhuri.net/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
|
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "ca.gurulogic.Blog.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
};
|
};
|
||||||
|
|
@ -761,6 +774,7 @@
|
||||||
INFOPLIST_FILE = samhuri.net/Info.plist;
|
INFOPLIST_FILE = samhuri.net/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
|
IPHONEOS_DEPLOYMENT_TARGET = 8.3;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "ca.gurulogic.Blog.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
};
|
};
|
||||||
|
|
@ -785,7 +799,9 @@
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
|
@ -828,6 +844,7 @@
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Distribution";
|
"CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Distribution";
|
||||||
COPY_PHASE_STRIP = YES;
|
COPY_PHASE_STRIP = YES;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
|
@ -856,6 +873,7 @@
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||||
INFOPLIST_FILE = Blog/Info.plist;
|
INFOPLIST_FILE = Blog/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "ca.gurulogic.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
};
|
};
|
||||||
|
|
@ -870,6 +888,7 @@
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||||
INFOPLIST_FILE = Blog/Info.plist;
|
INFOPLIST_FILE = Blog/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "ca.gurulogic.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
};
|
};
|
||||||
|
|
@ -889,6 +908,7 @@
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = BlogTests/Info.plist;
|
INFOPLIST_FILE = BlogTests/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "ca.gurulogic.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Blog.app/Blog";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Blog.app/Blog";
|
||||||
};
|
};
|
||||||
|
|
@ -904,6 +924,7 @@
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = BlogTests/Info.plist;
|
INFOPLIST_FILE = BlogTests/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "ca.gurulogic.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Blog.app/Blog";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Blog.app/Blog";
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
|
LastUpgradeVersion = "0700"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
|
@ -27,7 +28,28 @@
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
buildConfiguration = "Debug">
|
buildConfiguration = "Debug">
|
||||||
<Testables>
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "7B5C4BF419F2606900667D48"
|
||||||
|
BuildableName = "BlogTests.xctest"
|
||||||
|
BlueprintName = "BlogTests"
|
||||||
|
ReferencedContainer = "container:Blog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
</Testables>
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "7B5C4BD819F2606900667D48"
|
||||||
|
BuildableName = "Blog.app"
|
||||||
|
BlueprintName = "Blog"
|
||||||
|
ReferencedContainer = "container:Blog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
<LaunchAction
|
<LaunchAction
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
|
@ -37,6 +59,7 @@
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
debugDocumentVersioning = "YES"
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
allowLocationSimulation = "YES">
|
allowLocationSimulation = "YES">
|
||||||
<BuildableProductRunnable
|
<BuildableProductRunnable
|
||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
|
|
@ -57,6 +80,15 @@
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
debugDocumentVersioning = "YES">
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "7B5C4BD819F2606900667D48"
|
||||||
|
BuildableName = "Blog.app"
|
||||||
|
BlueprintName = "Blog"
|
||||||
|
ReferencedContainer = "container:Blog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
<AnalyzeAction
|
<AnalyzeAction
|
||||||
buildConfiguration = "Debug">
|
buildConfiguration = "Debug">
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,17 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
|
LastUpgradeVersion = "0700"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction>
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForRunning = "YES">
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "7B08B3E61AF9CAD300435579"
|
BlueprintIdentifier = "7B08B3E61AF9CAD300435579"
|
||||||
|
|
@ -15,10 +22,47 @@
|
||||||
</BuildActionEntry>
|
</BuildActionEntry>
|
||||||
</BuildActionEntries>
|
</BuildActionEntries>
|
||||||
</BuildAction>
|
</BuildAction>
|
||||||
<LaunchAction
|
<TestAction
|
||||||
useCustomWorkingDirectory = "NO"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
buildConfiguration = "Debug">
|
buildConfiguration = "Debug">
|
||||||
<BuildableProductRunnable>
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "7B5C4BF419F2606900667D48"
|
||||||
|
BuildableName = "BlogTests.xctest"
|
||||||
|
BlueprintName = "BlogTests"
|
||||||
|
ReferencedContainer = "container:Blog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "7B5C4BD819F2606900667D48"
|
||||||
|
BuildableName = "Blog.app"
|
||||||
|
BlueprintName = "Blog"
|
||||||
|
ReferencedContainer = "container:Blog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "7B5C4BD819F2606900667D48"
|
BlueprintIdentifier = "7B5C4BD819F2606900667D48"
|
||||||
|
|
@ -27,5 +71,30 @@
|
||||||
ReferencedContainer = "container:Blog.xcodeproj">
|
ReferencedContainer = "container:Blog.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "7B08B3E61AF9CAD300435579"
|
||||||
|
BuildableName = "samhuri.net.appex"
|
||||||
|
BlueprintName = "samhuri.net"
|
||||||
|
ReferencedContainer = "container:Blog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
</Scheme>
|
</Scheme>
|
||||||
|
|
|
||||||
|
|
@ -6,37 +6,27 @@
|
||||||
// Copyright (c) 2014 Guru Logic Inc. All rights reserved.
|
// Copyright (c) 2014 Guru Logic Inc. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import <HockeySDK/HockeySDK.h>
|
|
||||||
#import <dyci/SFDynamicCodeInjection.h>
|
#import <dyci/SFDynamicCodeInjection.h>
|
||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
#import "PostsViewController.h"
|
#import "PostsViewController.h"
|
||||||
#import "EditorViewController.h"
|
#import "EditorViewController.h"
|
||||||
#import "SamhuriNet.h"
|
#import "SamhuriNet.h"
|
||||||
#import "Functions.h"
|
#import "Functions.h"
|
||||||
|
#import "BlogSplitViewController.h"
|
||||||
|
|
||||||
@interface AppDelegate () <UISplitViewControllerDelegate>
|
@interface AppDelegate () <UISplitViewControllerDelegate>
|
||||||
|
|
||||||
@property (nonatomic, readonly, strong) SamhuriNet *site;
|
|
||||||
@property (nonatomic, readonly, strong) PostsViewController *postsViewController;
|
|
||||||
@property (nonatomic, readonly, strong) EditorViewController *editorViewControllerForPhone;
|
|
||||||
@property (nonatomic, readonly, strong) EditorViewController *editorViewControllerForPad;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AppDelegate
|
@implementation AppDelegate
|
||||||
|
|
||||||
@synthesize site = _site;
|
|
||||||
|
|
||||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||||
[self setupCodeInjection];
|
[self setupCodeInjection];
|
||||||
[self setupHockeySDK];
|
BlogSplitViewController *splitViewController = (BlogSplitViewController *)self.window.rootViewController;
|
||||||
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
|
|
||||||
UINavigationController *navigationController = splitViewController.viewControllers.lastObject;
|
|
||||||
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
|
|
||||||
splitViewController.delegate = self;
|
splitViewController.delegate = self;
|
||||||
self.postsViewController.blogController = self.site.blogController;
|
splitViewController.site = [SamhuriNet new];
|
||||||
self.editorViewControllerForPhone.blogController = self.site.blogController;
|
splitViewController.editorViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
|
||||||
self.editorViewControllerForPad.blogController = self.site.blogController;
|
splitViewController.editorViewController.navigationItem.leftItemsSupplementBackButton = YES;
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,43 +42,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setupHockeySDK {
|
|
||||||
[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"15435e2af912c96d7068c47c7bc6438f"];
|
|
||||||
[[BITHockeyManager sharedHockeyManager] startManager];
|
|
||||||
[[BITHockeyManager sharedHockeyManager].authenticator authenticateInstallation];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (PostsViewController *)postsViewController {
|
|
||||||
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
|
|
||||||
UINavigationController *navigationController = splitViewController.viewControllers.firstObject;
|
|
||||||
PostsViewController *postsViewController = (PostsViewController *)navigationController.viewControllers.firstObject;
|
|
||||||
return postsViewController;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (EditorViewController *)editorViewControllerForPhone {
|
|
||||||
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
|
|
||||||
UINavigationController *navigationController = splitViewController.viewControllers.firstObject;
|
|
||||||
if (navigationController.viewControllers.count > 1) {
|
|
||||||
navigationController = navigationController.viewControllers.lastObject;
|
|
||||||
}
|
|
||||||
EditorViewController *editorViewController = (EditorViewController *)navigationController.viewControllers.firstObject;
|
|
||||||
return editorViewController;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (EditorViewController *)editorViewControllerForPad {
|
|
||||||
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
|
|
||||||
UINavigationController *navigationController = splitViewController.viewControllers.lastObject;
|
|
||||||
EditorViewController *editorViewController = (EditorViewController *)navigationController.viewControllers.firstObject;
|
|
||||||
return editorViewController;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (SamhuriNet *)site {
|
|
||||||
if (!_site) {
|
|
||||||
_site = [SamhuriNet new];
|
|
||||||
}
|
|
||||||
return _site;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationWillResignActive:(UIApplication *)application {
|
- (void)applicationWillResignActive:(UIApplication *)application {
|
||||||
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
||||||
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
|
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
|
||||||
|
|
@ -131,14 +84,10 @@
|
||||||
NSLog(@"did decode restorable state with coder %@", coder);
|
NSLog(@"did decode restorable state with coder %@", coder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - UISplitViewDelegate methods
|
#pragma mark - UISplitViewDelegate methods
|
||||||
|
|
||||||
- (BOOL) splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
|
- (BOOL)splitViewController:(BlogSplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
|
||||||
UINavigationController *navigationController = [secondaryViewController isKindOfClass:[UINavigationController class]]
|
EditorViewController *editorViewController = splitViewController.editorViewController;
|
||||||
? (UINavigationController *)secondaryViewController
|
|
||||||
: nil;
|
|
||||||
EditorViewController *editorViewController = navigationController.topViewController ? safeCast(navigationController.topViewController, [EditorViewController class]) : nil;
|
|
||||||
if (!editorViewController.post) {
|
if (!editorViewController.post) {
|
||||||
// Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
|
// Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
|
||||||
return YES;
|
return YES;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="H1p-Uh-vWS">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8121.20" systemVersion="15A204h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="H1p-Uh-vWS">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8101.16"/>
|
||||||
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
||||||
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
@ -22,6 +23,7 @@
|
||||||
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
||||||
<navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" barStyle="black" translucent="NO" id="Pmd-2v-anx">
|
<navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" barStyle="black" translucent="NO" id="Pmd-2v-anx">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<animations/>
|
||||||
<color key="tintColor" red="0.79534143518518507" green="0.0" blue="0.013255690586419705" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="tintColor" red="0.79534143518518507" green="0.0" blue="0.013255690586419705" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<color key="barTintColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="barTintColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<textAttributes key="titleTextAttributes">
|
<textAttributes key="titleTextAttributes">
|
||||||
|
|
@ -45,7 +47,7 @@
|
||||||
<viewControllerLayoutGuide type="bottom" id="GAO-Cl-Wes"/>
|
<viewControllerLayoutGuide type="bottom" id="GAO-Cl-Wes"/>
|
||||||
</layoutGuides>
|
</layoutGuides>
|
||||||
<view key="view" contentMode="scaleToFill" id="svH-Pt-448">
|
<view key="view" contentMode="scaleToFill" id="svH-Pt-448">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="536"/>
|
<rect key="frame" x="0.0" y="64" width="600" height="536"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="D5w-s5-7oj" userLabel="Link View">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="D5w-s5-7oj" userLabel="Link View">
|
||||||
|
|
@ -53,6 +55,7 @@
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UEU-f2-Xco" userLabel="Link">
|
<button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UEU-f2-Xco" userLabel="Link">
|
||||||
<rect key="frame" x="0.0" y="4" width="30" height="24"/>
|
<rect key="frame" x="0.0" y="4" width="30" height="24"/>
|
||||||
|
<animations/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" secondItem="UEU-f2-Xco" secondAttribute="height" multiplier="1:1" id="HaA-ZR-lpJ"/>
|
<constraint firstAttribute="width" secondItem="UEU-f2-Xco" secondAttribute="height" multiplier="1:1" id="HaA-ZR-lpJ"/>
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="20" id="o69-uA-gKN"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="20" id="o69-uA-gKN"/>
|
||||||
|
|
@ -69,7 +72,8 @@
|
||||||
</variation>
|
</variation>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" restorationIdentifier="Link Button" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ydf-ii-P8M">
|
<button opaque="NO" contentMode="scaleToFill" restorationIdentifier="Link Button" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ydf-ii-P8M">
|
||||||
<rect key="frame" x="30" y="1" width="116" height="29"/>
|
<rect key="frame" x="30" y="1" width="117" height="29"/>
|
||||||
|
<animations/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<state key="normal" title="http://samhuri.net">
|
<state key="normal" title="http://samhuri.net">
|
||||||
<color key="titleColor" red="0.96862745098039216" green="0.96862745098039216" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="titleColor" red="0.96862745098039216" green="0.96862745098039216" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
|
@ -81,6 +85,7 @@
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleAspectFit" restorationIdentifier="Remove Link Button" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="81X-Pe-PFV">
|
<button opaque="NO" contentMode="scaleAspectFit" restorationIdentifier="Remove Link Button" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="81X-Pe-PFV">
|
||||||
<rect key="frame" x="570" y="0.0" width="30" height="30"/>
|
<rect key="frame" x="570" y="0.0" width="30" height="30"/>
|
||||||
|
<animations/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" secondItem="81X-Pe-PFV" secondAttribute="height" multiplier="1:1" id="iW2-b5-VdB"/>
|
<constraint firstAttribute="width" secondItem="81X-Pe-PFV" secondAttribute="height" multiplier="1:1" id="iW2-b5-VdB"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
|
|
@ -94,6 +99,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.66666666669999997" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.66666666669999997" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerY" secondItem="ydf-ii-P8M" secondAttribute="centerY" id="0vl-tP-uea"/>
|
<constraint firstAttribute="centerY" secondItem="ydf-ii-P8M" secondAttribute="centerY" id="0vl-tP-uea"/>
|
||||||
|
|
@ -118,7 +124,8 @@
|
||||||
</variation>
|
</variation>
|
||||||
</view>
|
</view>
|
||||||
<label opaque="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Using Emacs to Develop Mojo Apps for WebOS or Something Even Longer Than That" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HlE-1R-AqU" userLabel="Title Label">
|
<label opaque="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Using Emacs to Develop Mojo Apps for WebOS or Something Even Longer Than That" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HlE-1R-AqU" userLabel="Title Label">
|
||||||
<rect key="frame" x="21" y="38" width="559" height="41"/>
|
<rect key="frame" x="21" y="38" width="559.5" height="40.5"/>
|
||||||
|
<animations/>
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
|
||||||
<color key="textColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
|
|
@ -127,14 +134,16 @@
|
||||||
</connections>
|
</connections>
|
||||||
</label>
|
</label>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Cwh-4G-e0V" userLabel="Separator View">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Cwh-4G-e0V" userLabel="Separator View">
|
||||||
<rect key="frame" x="0.0" y="87" width="600" height="1"/>
|
<rect key="frame" x="0.0" y="86" width="600" height="1"/>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.31372549019607843" green="0.31372549019607843" blue="0.31372549019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.31372549019607843" green="0.31372549019607843" blue="0.31372549019607843" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="1" id="zkb-Pd-Wg0"/>
|
<constraint firstAttribute="height" constant="1" id="zkb-Pd-Wg0"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" restorationIdentifier="Editor Text View" alwaysBounceVertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wrG-1y-ZY3">
|
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" restorationIdentifier="Editor Text View" alwaysBounceVertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wrG-1y-ZY3">
|
||||||
<rect key="frame" x="0.0" y="88" width="600" height="404"/>
|
<rect key="frame" x="0.0" y="87" width="600" height="404.5"/>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.26666666666666666" green="0.26666666666666666" blue="0.26666666666666666" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.26666666666666666" green="0.26666666666666666" blue="0.26666666666666666" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<string key="text">The latest technology I've been learning is Palm's SDK for webOS,
|
<string key="text">The latest technology I've been learning is Palm's SDK for webOS,
|
||||||
Mojo. My first impression is that it's a great platform and
|
Mojo. My first impression is that it's a great platform and
|
||||||
|
|
@ -180,6 +189,7 @@ wanted with as little input and thought as possible.</string>
|
||||||
</textView>
|
</textView>
|
||||||
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YUD-Xe-6Cc">
|
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YUD-Xe-6Cc">
|
||||||
<rect key="frame" x="0.0" y="492" width="600" height="44"/>
|
<rect key="frame" x="0.0" y="492" width="600" height="44"/>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.13333333333333333" green="0.13333333333333333" blue="0.13333333333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.13333333333333333" green="0.13333333333333333" blue="0.13333333333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<items>
|
<items>
|
||||||
<barButtonItem title="Publish" id="qEb-VA-ueB">
|
<barButtonItem title="Publish" id="qEb-VA-ueB">
|
||||||
|
|
@ -203,6 +213,7 @@ wanted with as little input and thought as possible.</string>
|
||||||
<color key="barTintColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="barTintColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</toolbar>
|
</toolbar>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<color key="tintColor" red="0.7953414352" green="0.0" blue="0.013255690590000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="tintColor" red="0.7953414352" green="0.0" blue="0.013255690590000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
|
|
@ -284,6 +295,7 @@ wanted with as little input and thought as possible.</string>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="Text Field" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="G2v-XU-V16">
|
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="Text Field" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="G2v-XU-V16">
|
||||||
<rect key="frame" x="16" y="15" width="288" height="30"/>
|
<rect key="frame" x="16" y="15" width="288" height="30"/>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<color key="textColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
|
|
@ -293,6 +305,7 @@ wanted with as little input and thought as possible.</string>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
<animations/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="G2v-XU-V16" secondAttribute="centerX" id="1bq-IE-HrD"/>
|
<constraint firstAttribute="centerX" secondItem="G2v-XU-V16" secondAttribute="centerX" id="1bq-IE-HrD"/>
|
||||||
<constraint firstItem="G2v-XU-V16" firstAttribute="width" secondItem="B66-2b-lYL" secondAttribute="width" constant="-32" id="7ms-ZC-kzo"/>
|
<constraint firstItem="G2v-XU-V16" firstAttribute="width" secondItem="B66-2b-lYL" secondAttribute="width" constant="-32" id="7ms-ZC-kzo"/>
|
||||||
|
|
@ -321,16 +334,19 @@ wanted with as little input and thought as possible.</string>
|
||||||
<viewControllerLayoutGuide type="bottom" id="qQh-ht-rVd"/>
|
<viewControllerLayoutGuide type="bottom" id="qQh-ht-rVd"/>
|
||||||
</layoutGuides>
|
</layoutGuides>
|
||||||
<view key="view" contentMode="scaleToFill" id="d1U-C6-XQQ">
|
<view key="view" contentMode="scaleToFill" id="d1U-C6-XQQ">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="536"/>
|
<rect key="frame" x="0.0" y="64" width="600" height="536"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="zNM-N6-tdC">
|
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="zNM-N6-tdC">
|
||||||
<rect key="frame" x="282" y="250" width="37" height="37"/>
|
<rect key="frame" x="282" y="250" width="37" height="37"/>
|
||||||
|
<animations/>
|
||||||
</activityIndicatorView>
|
</activityIndicatorView>
|
||||||
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="LTA-w8-Izg">
|
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="LTA-w8-Izg">
|
||||||
<rect key="frame" x="564" y="20" width="20" height="20"/>
|
<rect key="frame" x="560" y="20" width="20" height="20"/>
|
||||||
|
<animations/>
|
||||||
</activityIndicatorView>
|
</activityIndicatorView>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="LTA-w8-Izg" firstAttribute="trailing" secondItem="d1U-C6-XQQ" secondAttribute="trailingMargin" id="2XG-V6-KeX"/>
|
<constraint firstItem="LTA-w8-Izg" firstAttribute="trailing" secondItem="d1U-C6-XQQ" secondAttribute="trailingMargin" id="2XG-V6-KeX"/>
|
||||||
|
|
@ -352,10 +368,10 @@ wanted with as little input and thought as possible.</string>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="1478" y="129"/>
|
<point key="canvasLocation" x="1478" y="129"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Split View Controller-->
|
<!--Blog Split View Controller-->
|
||||||
<scene sceneID="Nki-YV-4Qg">
|
<scene sceneID="Nki-YV-4Qg">
|
||||||
<objects>
|
<objects>
|
||||||
<splitViewController storyboardIdentifier="Split View Controller" useStoryboardIdentifierAsRestorationIdentifier="YES" id="H1p-Uh-vWS" sceneMemberID="viewController">
|
<splitViewController storyboardIdentifier="Split View Controller" useStoryboardIdentifierAsRestorationIdentifier="YES" id="H1p-Uh-vWS" customClass="BlogSplitViewController" sceneMemberID="viewController">
|
||||||
<toolbarItems/>
|
<toolbarItems/>
|
||||||
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|
@ -372,13 +388,15 @@ wanted with as little input and thought as possible.</string>
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController storyboardIdentifier="Posts View Controller" title="Posts" useStoryboardIdentifierAsRestorationIdentifier="YES" id="7bK-jq-Zjz" customClass="PostsViewController" sceneMemberID="viewController">
|
<tableViewController storyboardIdentifier="Posts View Controller" title="Posts" useStoryboardIdentifierAsRestorationIdentifier="YES" id="7bK-jq-Zjz" customClass="PostsViewController" sceneMemberID="viewController">
|
||||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="Posts Table View" alwaysBounceVertical="YES" indicatorStyle="white" keyboardDismissMode="interactive" dataMode="prototypes" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="r7i-6Z-zg0">
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="Posts Table View" alwaysBounceVertical="YES" indicatorStyle="white" keyboardDismissMode="interactive" dataMode="prototypes" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="r7i-6Z-zg0">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="536"/>
|
<rect key="frame" x="0.0" y="64" width="600" height="536"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.66666666669999997" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.66666666669999997" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<color key="tintColor" red="0.7953414352" green="0.0" blue="0.013255690590000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="tintColor" red="0.7953414352" green="0.0" blue="0.013255690590000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<searchBar key="tableHeaderView" contentMode="redraw" barStyle="black" searchBarStyle="minimal" placeholder="Search" showsCancelButton="YES" id="QTr-jX-TNh">
|
<searchBar key="tableHeaderView" contentMode="redraw" barStyle="black" searchBarStyle="minimal" placeholder="Search" showsCancelButton="YES" id="QTr-jX-TNh">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||||
|
<animations/>
|
||||||
<color key="tintColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="tintColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<color key="barTintColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="barTintColor" red="0.96862745100000003" green="0.96862745100000003" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<textInputTraits key="textInputTraits" returnKeyType="search" enablesReturnKeyAutomatically="YES"/>
|
<textInputTraits key="textInputTraits" returnKeyType="search" enablesReturnKeyAutomatically="YES"/>
|
||||||
|
|
@ -388,25 +406,28 @@ wanted with as little input and thought as possible.</string>
|
||||||
</searchBar>
|
</searchBar>
|
||||||
<prototypes>
|
<prototypes>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" rowHeight="58" id="WCw-Qf-5nD" customClass="PostCell">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" rowHeight="58" id="WCw-Qf-5nD" customClass="PostCell">
|
||||||
<rect key="frame" x="0.0" y="86" width="320" height="44"/>
|
<rect key="frame" x="0.0" y="93.5" width="600" height="58"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WCw-Qf-5nD" id="37f-cq-3Eg">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WCw-Qf-5nD" id="37f-cq-3Eg">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="57.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="2015-04-19" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vd6-ZS-EnM">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="2015-04-19" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vd6-ZS-EnM">
|
||||||
<rect key="frame" x="8" y="35" width="65" height="14.5"/>
|
<rect key="frame" x="8" y="35" width="68" height="14.5"/>
|
||||||
|
<animations/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
||||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="I Can't Wait to See What Trey Parker & Matt Stone Do With This" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sTp-VX-x9k">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="I Can't Wait to See What Trey Parker & Matt Stone Do With This" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sTp-VX-x9k">
|
||||||
<rect key="frame" x="8" y="11" width="584" height="17"/>
|
<rect key="frame" x="8" y="11" width="584" height="17"/>
|
||||||
|
<animations/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
<animations/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="vd6-ZS-EnM" firstAttribute="top" secondItem="sTp-VX-x9k" secondAttribute="bottom" constant="2" id="40P-IG-vhq"/>
|
<constraint firstItem="vd6-ZS-EnM" firstAttribute="top" secondItem="sTp-VX-x9k" secondAttribute="bottom" constant="2" id="40P-IG-vhq"/>
|
||||||
<constraint firstAttribute="bottomMargin" secondItem="vd6-ZS-EnM" secondAttribute="bottom" id="5E9-cV-kNx"/>
|
<constraint firstAttribute="bottomMargin" secondItem="vd6-ZS-EnM" secondAttribute="bottom" id="5E9-cV-kNx"/>
|
||||||
|
|
@ -438,6 +459,7 @@ wanted with as little input and thought as possible.</string>
|
||||||
</mask>
|
</mask>
|
||||||
</variation>
|
</variation>
|
||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
|
<animations/>
|
||||||
<color key="backgroundColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dateLabel" destination="vd6-ZS-EnM" id="mER-WA-QZz"/>
|
<outlet property="dateLabel" destination="vd6-ZS-EnM" id="mER-WA-QZz"/>
|
||||||
|
|
@ -462,6 +484,7 @@ wanted with as little input and thought as possible.</string>
|
||||||
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
||||||
<refreshControl key="refreshControl" opaque="NO" multipleTouchEnabled="YES" contentMode="center" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="ywL-K4-nCx">
|
<refreshControl key="refreshControl" opaque="NO" multipleTouchEnabled="YES" contentMode="center" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="ywL-K4-nCx">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<animations/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="refresh:" destination="7bK-jq-Zjz" eventType="valueChanged" id="N7M-8B-qbe"/>
|
<action selector="refresh:" destination="7bK-jq-Zjz" eventType="valueChanged" id="N7M-8B-qbe"/>
|
||||||
</connections>
|
</connections>
|
||||||
|
|
@ -493,6 +516,7 @@ wanted with as little input and thought as possible.</string>
|
||||||
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
||||||
<navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" barStyle="black" translucent="NO" id="DjV-YW-jjY">
|
<navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" barStyle="black" translucent="NO" id="DjV-YW-jjY">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<animations/>
|
||||||
<color key="tintColor" red="0.7953414352" green="0.0" blue="0.013255690590000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="tintColor" red="0.7953414352" green="0.0" blue="0.013255690590000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<color key="barTintColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="barTintColor" red="0.1333333333" green="0.1333333333" blue="0.1333333333" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<textAttributes key="titleTextAttributes">
|
<textAttributes key="titleTextAttributes">
|
||||||
|
|
@ -509,6 +533,6 @@ wanted with as little input and thought as possible.</string>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<inferredMetricsTieBreakers>
|
<inferredMetricsTieBreakers>
|
||||||
<segue reference="6S0-TO-JiA"/>
|
<segue reference="Tll-UG-LXB"/>
|
||||||
</inferredMetricsTieBreakers>
|
</inferredMetricsTieBreakers>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
17
Blog/BlogSplitViewController.h
Normal file
17
Blog/BlogSplitViewController.h
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
//
|
||||||
|
// Created by Sami Samhuri on 2015-06-27.
|
||||||
|
// Copyright (c) 2015 Guru Logic Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
@import UIKit;
|
||||||
|
|
||||||
|
@class SamhuriNet;
|
||||||
|
@class EditorViewController;
|
||||||
|
|
||||||
|
@interface BlogSplitViewController : UISplitViewController
|
||||||
|
|
||||||
|
@property (nonatomic, strong) SamhuriNet *site;
|
||||||
|
@property (nonatomic, readonly, strong) UINavigationController *masterNavigationController;
|
||||||
|
@property (nonatomic, readonly, strong) UINavigationController *detailNavigationController;
|
||||||
|
@property (nonatomic, readonly, strong) EditorViewController *editorViewController;
|
||||||
|
|
||||||
|
@end
|
||||||
56
Blog/BlogSplitViewController.m
Normal file
56
Blog/BlogSplitViewController.m
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
//
|
||||||
|
// Created by Sami Samhuri on 2015-06-27.
|
||||||
|
// Copyright (c) 2015 Guru Logic Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
#import <ObjectiveSugar/NSArray+ObjectiveSugar.h>
|
||||||
|
#import "BlogSplitViewController.h"
|
||||||
|
#import "PostsViewController.h"
|
||||||
|
#import "EditorViewController.h"
|
||||||
|
#import "SamhuriNet.h"
|
||||||
|
|
||||||
|
@interface BlogSplitViewController ()
|
||||||
|
|
||||||
|
@property (nonatomic, readonly, strong) PostsViewController *postsViewController;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation BlogSplitViewController
|
||||||
|
|
||||||
|
- (void)setSite:(SamhuriNet *)site {
|
||||||
|
_site = site;
|
||||||
|
self.postsViewController.blogController = self.site.blogController;
|
||||||
|
self.editorViewController.blogController = self.site.blogController;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)awakeFromNib {
|
||||||
|
[super awakeFromNib];
|
||||||
|
self.postsViewController.preferredContentSize = CGSizeMake(320, 600);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator {
|
||||||
|
[super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
|
||||||
|
[self updateForNewTraitCollection:newCollection];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateForNewTraitCollection:(UITraitCollection *)newCollection {
|
||||||
|
BOOL isCompact = newCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact;
|
||||||
|
self.postsViewController.clearsSelectionOnViewWillAppear = isCompact;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (UINavigationController *)masterNavigationController {
|
||||||
|
return self.viewControllers.firstObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (UINavigationController *)detailNavigationController {
|
||||||
|
return self.viewControllers.count == 2 ? self.viewControllers.lastObject : nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (PostsViewController *)postsViewController {
|
||||||
|
return (PostsViewController *)self.masterNavigationController.viewControllers.firstObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (EditorViewController *)editorViewController {
|
||||||
|
return (EditorViewController *)self.detailNavigationController.viewControllers.firstObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
#import "UIColor+Hex.h"
|
#import "UIColor+Hex.h"
|
||||||
#import "MBProgressHUD.h"
|
#import "MBProgressHUD.h"
|
||||||
#import "CommonUI.h"
|
#import "CommonUI.h"
|
||||||
|
#import "NotificationToSelectorMap.h"
|
||||||
|
|
||||||
@interface EditorViewController () <UITextViewDelegate, UIPopoverPresentationControllerDelegate>
|
@interface EditorViewController () <UITextViewDelegate, UIPopoverPresentationControllerDelegate>
|
||||||
|
|
||||||
|
|
@ -34,6 +35,7 @@
|
||||||
@property (nonatomic, strong) Post *modifiedPost;
|
@property (nonatomic, strong) Post *modifiedPost;
|
||||||
@property (nonatomic, readonly, assign, getter=isDirty) BOOL dirty;
|
@property (nonatomic, readonly, assign, getter=isDirty) BOOL dirty;
|
||||||
@property (nonatomic, strong) PMKPromise *savePromise;
|
@property (nonatomic, strong) PMKPromise *savePromise;
|
||||||
|
@property (nonatomic, strong) NotificationToSelectorMap *notificationMap;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
@ -42,38 +44,46 @@
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
[self setupFontAwesomeIcons];
|
[self setupFontAwesomeIcons];
|
||||||
|
[self setupNotifications];
|
||||||
|
self.linkView.hidden = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setupNotifications {
|
||||||
|
NSDictionary *map = @{UIApplicationWillResignActiveNotification: NSStringFromSelector(@selector(applicationWillResignActive:)),
|
||||||
|
UIApplicationDidBecomeActiveNotification: NSStringFromSelector(@selector(applicationDidBecomeActive:)),
|
||||||
|
UIPasteboardChangedNotification: NSStringFromSelector(@selector(configureLinkView)),
|
||||||
|
UIKeyboardWillShowNotification: NSStringFromSelector(@selector(keyboardWillShow:)),
|
||||||
|
UIKeyboardWillHideNotification: NSStringFromSelector(@selector(keyboardWillHide:)),
|
||||||
|
DraftRemovedNotification: NSStringFromSelector(@selector(postDeleted:)),
|
||||||
|
PublishedPostRemovedNotification: NSStringFromSelector(@selector(postDeleted:)),
|
||||||
|
};
|
||||||
|
self.notificationMap = [[NotificationToSelectorMap alloc] initWithNotificationMap:map];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewWillAppear:(BOOL)animated {
|
- (void)viewWillAppear:(BOOL)animated {
|
||||||
[super viewWillAppear:animated];
|
[super viewWillAppear:animated];
|
||||||
NSAssert(self.blogController, @"blogController is required");
|
NSAssert(self.blogController, @"blogController is required");
|
||||||
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(configureLinkView) name:UIPasteboardChangedNotification object:nil];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(postDeleted:) name:DraftRemovedNotification object:nil];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(postDeleted:) name:PublishedPostRemovedNotification object:nil];
|
|
||||||
[self configureView];
|
[self configureView];
|
||||||
[self restoreScrollOffset];
|
[self restoreScrollOffset];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewDidAppear:(BOOL)animated {
|
||||||
|
[super viewDidAppear:animated];
|
||||||
|
[self.notificationMap addObserver:self];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)viewWillDisappear:(BOOL)animated {
|
- (void)viewWillDisappear:(BOOL)animated {
|
||||||
[super viewWillDisappear:animated];
|
[super viewWillDisappear:animated];
|
||||||
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
|
|
||||||
[notificationCenter removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
|
|
||||||
[notificationCenter removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
|
|
||||||
[notificationCenter removeObserver:self name:UIPasteboardChangedNotification object:nil];
|
|
||||||
[notificationCenter removeObserver:self name:UIKeyboardWillShowNotification object:nil];
|
|
||||||
[notificationCenter removeObserver:self name:UIKeyboardWillHideNotification object:nil];
|
|
||||||
[notificationCenter removeObserver:self name:DraftRemovedNotification object:nil];
|
|
||||||
[notificationCenter removeObserver:self name:PublishedPostRemovedNotification object:nil];
|
|
||||||
if (self.post) {
|
if (self.post) {
|
||||||
[self savePostAndWaitForCompilation:NO];
|
[self savePostAndWaitForCompilation:NO];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewDidDisappear:(BOOL)animated {
|
||||||
|
[super viewDidDisappear:animated];
|
||||||
|
[self.notificationMap removeObserver:self];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
||||||
[super prepareForSegue:segue sender:sender];
|
[super prepareForSegue:segue sender:sender];
|
||||||
if ([segue.identifier isEqualToString:@"showPreview"]) {
|
if ([segue.identifier isEqualToString:@"showPreview"]) {
|
||||||
|
|
@ -119,7 +129,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)statusText {
|
- (NSString *)statusText {
|
||||||
return self.modifiedPost.draft ? @"Draft" : self.modifiedPost.date;
|
if (self.post) {
|
||||||
|
return self.modifiedPost.draft ? @"Draft" : self.modifiedPost.date;
|
||||||
|
}
|
||||||
|
return @"";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)configureLinkView {
|
- (void)configureLinkView {
|
||||||
|
|
@ -131,6 +144,7 @@
|
||||||
self.removeLinkButton.hidden = !url;
|
self.removeLinkButton.hidden = !url;
|
||||||
const CGFloat titleLabelTop = TitleLabelTopMargin + CGRectGetMaxY(self.linkView.frame);
|
const CGFloat titleLabelTop = TitleLabelTopMargin + CGRectGetMaxY(self.linkView.frame);
|
||||||
if (self.titleLabelTopConstraint.constant <= titleLabelTop) {
|
if (self.titleLabelTopConstraint.constant <= titleLabelTop) {
|
||||||
|
self.linkView.hidden = NO;
|
||||||
self.linkView.alpha = 1;
|
self.linkView.alpha = 1;
|
||||||
self.linkButton.alpha = 0;
|
self.linkButton.alpha = 0;
|
||||||
[UIView animateWithDuration:0.3 animations:^{
|
[UIView animateWithDuration:0.3 animations:^{
|
||||||
|
|
@ -143,6 +157,8 @@
|
||||||
[UIView animateWithDuration:0.3 animations:^{
|
[UIView animateWithDuration:0.3 animations:^{
|
||||||
self.linkView.alpha = 0;
|
self.linkView.alpha = 0;
|
||||||
self.titleLabelTopConstraint.constant = TitleLabelTopMargin;
|
self.titleLabelTopConstraint.constant = TitleLabelTopMargin;
|
||||||
|
} completion:^(BOOL finished) {
|
||||||
|
self.linkView.hidden = YES;
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>ca.gurulogic.$(PRODUCT_NAME:rfc1034identifier)</string>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
|
|
@ -22,6 +22,20 @@
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>UIAppFonts</key>
|
||||||
|
<array>
|
||||||
|
<string>FontAwesome.otf</string>
|
||||||
|
<string>MuseoSans-100-Italic.otf</string>
|
||||||
|
<string>MuseoSans-100.otf</string>
|
||||||
|
<string>MuseoSans-300-Italic.otf</string>
|
||||||
|
<string>MuseoSans-300.otf</string>
|
||||||
|
<string>MuseoSans-500-Italic.otf</string>
|
||||||
|
<string>MuseoSans-500.otf</string>
|
||||||
|
<string>MuseoSans-700-Italic.otf</string>
|
||||||
|
<string>MuseoSans-700.otf</string>
|
||||||
|
<string>MuseoSans-900-Italic.otf</string>
|
||||||
|
<string>MuseoSans-900.otf</string>
|
||||||
|
</array>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
|
|
@ -32,8 +46,6 @@
|
||||||
</array>
|
</array>
|
||||||
<key>UIStatusBarStyle</key>
|
<key>UIStatusBarStyle</key>
|
||||||
<string>UIStatusBarStyleLightContent</string>
|
<string>UIStatusBarStyleLightContent</string>
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
|
||||||
<false/>
|
|
||||||
<key>UIStatusBarTintParameters</key>
|
<key>UIStatusBarTintParameters</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>UINavigationBar</key>
|
<key>UINavigationBar</key>
|
||||||
|
|
@ -49,6 +61,7 @@
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
<array>
|
<array>
|
||||||
|
|
@ -57,19 +70,7 @@
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UIAppFonts</key>
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
<array>
|
<false/>
|
||||||
<string>FontAwesome.otf</string>
|
|
||||||
<string>MuseoSans-100-Italic.otf</string>
|
|
||||||
<string>MuseoSans-100.otf</string>
|
|
||||||
<string>MuseoSans-300-Italic.otf</string>
|
|
||||||
<string>MuseoSans-300.otf</string>
|
|
||||||
<string>MuseoSans-500-Italic.otf</string>
|
|
||||||
<string>MuseoSans-500.otf</string>
|
|
||||||
<string>MuseoSans-700-Italic.otf</string>
|
|
||||||
<string>MuseoSans-700.otf</string>
|
|
||||||
<string>MuseoSans-900-Italic.otf</string>
|
|
||||||
<string>MuseoSans-900.otf</string>
|
|
||||||
</array>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
||||||
19
Blog/NotificationToSelectorMap.h
Normal file
19
Blog/NotificationToSelectorMap.h
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
//
|
||||||
|
// NotificationToSelectorMap.h
|
||||||
|
// Blog
|
||||||
|
//
|
||||||
|
// Created by Sami Samhuri on 2015-06-29.
|
||||||
|
// Copyright © 2015 Guru Logic Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface NotificationToSelectorMap : NSObject
|
||||||
|
|
||||||
|
@property (nonatomic, copy, nonnull) NSDictionary *notificationNameToSelectorNameMap;
|
||||||
|
|
||||||
|
- (nonnull instancetype)initWithNotificationMap:(nonnull NSDictionary *)notificationMap;
|
||||||
|
- (void)addObserver:(nonnull NSObject *)observer;
|
||||||
|
- (void)removeObserver:(nonnull NSObject *)observer;
|
||||||
|
|
||||||
|
@end
|
||||||
36
Blog/NotificationToSelectorMap.m
Normal file
36
Blog/NotificationToSelectorMap.m
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
//
|
||||||
|
// NotificationToSelectorMap.m
|
||||||
|
// Blog
|
||||||
|
//
|
||||||
|
// Created by Sami Samhuri on 2015-06-29.
|
||||||
|
// Copyright © 2015 Guru Logic Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "NotificationToSelectorMap.h"
|
||||||
|
|
||||||
|
@implementation NotificationToSelectorMap
|
||||||
|
|
||||||
|
- (nonnull instancetype)initWithNotificationMap:(nonnull NSDictionary *)notificationMap {
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
_notificationNameToSelectorNameMap = notificationMap;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)addObserver:(nonnull NSObject *)observer {
|
||||||
|
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
|
||||||
|
for (NSString *notificationName in self.notificationNameToSelectorNameMap.allKeys) {
|
||||||
|
NSString *selectorName = self.notificationNameToSelectorNameMap[notificationName];
|
||||||
|
[notificationCenter addObserver:observer selector:NSSelectorFromString(selectorName) name:notificationName object:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)removeObserver:(nonnull NSObject *)observer {
|
||||||
|
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
|
||||||
|
for (NSString *notificationName in self.notificationNameToSelectorNameMap.allKeys) {
|
||||||
|
[notificationCenter removeObserver:observer name:notificationName object:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -38,6 +38,7 @@
|
||||||
@property (nonatomic, copy) NSString *blogStatusText;
|
@property (nonatomic, copy) NSString *blogStatusText;
|
||||||
@property (nonatomic, strong) NSDate *blogStatusDate;
|
@property (nonatomic, strong) NSDate *blogStatusDate;
|
||||||
@property (nonatomic, strong) NSTimer *blogStatusTimer;
|
@property (nonatomic, strong) NSTimer *blogStatusTimer;
|
||||||
|
@property (nonatomic, strong) NSIndexPath *selectedIndexPath;
|
||||||
@property (nonatomic, weak) NSLayoutConstraint *titleViewWidthConstraint;
|
@property (nonatomic, weak) NSLayoutConstraint *titleViewWidthConstraint;
|
||||||
@property (nonatomic, weak) NSLayoutConstraint *titleViewHeightConstraint;
|
@property (nonatomic, weak) NSLayoutConstraint *titleViewHeightConstraint;
|
||||||
@property (nonatomic, weak) NSLayoutConstraint *titleLabelTopConstraint;
|
@property (nonatomic, weak) NSLayoutConstraint *titleLabelTopConstraint;
|
||||||
|
|
@ -63,11 +64,6 @@ static const NSUInteger SectionPublished = 1;
|
||||||
|
|
||||||
- (void)awakeFromNib {
|
- (void)awakeFromNib {
|
||||||
[super awakeFromNib];
|
[super awakeFromNib];
|
||||||
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
|
|
||||||
self.clearsSelectionOnViewWillAppear = NO;
|
|
||||||
self.preferredContentSize = CGSizeMake(320.0, 600.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
[self setupTitleView];
|
[self setupTitleView];
|
||||||
[self setupFontAwesomeIcons];
|
[self setupFontAwesomeIcons];
|
||||||
self.refreshControl.tintColor = [UIColor whiteColor];
|
self.refreshControl.tintColor = [UIColor whiteColor];
|
||||||
|
|
@ -84,7 +80,7 @@ static const NSUInteger SectionPublished = 1;
|
||||||
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:titleView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0];
|
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:titleView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0];
|
||||||
[titleView addConstraint:widthConstraint];
|
[titleView addConstraint:widthConstraint];
|
||||||
self.titleViewWidthConstraint = widthConstraint;
|
self.titleViewWidthConstraint = widthConstraint;
|
||||||
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:titleView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0];
|
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:titleView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:8 + CGRectGetMaxY(self.navigationController.navigationBar.frame)];
|
||||||
[titleView addConstraint:heightConstraint];
|
[titleView addConstraint:heightConstraint];
|
||||||
self.titleViewHeightConstraint = heightConstraint;
|
self.titleViewHeightConstraint = heightConstraint;
|
||||||
titleView.translatesAutoresizingMaskIntoConstraints = NO;
|
titleView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
|
|
@ -100,9 +96,7 @@ static const NSUInteger SectionPublished = 1;
|
||||||
titleLabel.text = self.navigationItem.title;
|
titleLabel.text = self.navigationItem.title;
|
||||||
[titleLabel sizeToFit];
|
[titleLabel sizeToFit];
|
||||||
[titleView addSubview:titleLabel];
|
[titleView addSubview:titleLabel];
|
||||||
NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:titleLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeTop multiplier:1 constant:0];
|
[titleView addConstraint:[NSLayoutConstraint constraintWithItem:titleLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeTop multiplier:1 constant:18]];
|
||||||
[titleView addConstraint:topConstraint];
|
|
||||||
self.titleLabelTopConstraint = topConstraint;
|
|
||||||
[titleView addConstraint:[NSLayoutConstraint constraintWithItem:titleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
|
[titleView addConstraint:[NSLayoutConstraint constraintWithItem:titleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
|
||||||
self.titleLabel = titleLabel;
|
self.titleLabel = titleLabel;
|
||||||
UILabel *subtitleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
|
UILabel *subtitleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
|
||||||
|
|
@ -111,26 +105,15 @@ static const NSUInteger SectionPublished = 1;
|
||||||
subtitleLabel.textColor = [UIColor whiteColor];
|
subtitleLabel.textColor = [UIColor whiteColor];
|
||||||
[subtitleLabel sizeToFit];
|
[subtitleLabel sizeToFit];
|
||||||
[titleView addSubview:subtitleLabel];
|
[titleView addSubview:subtitleLabel];
|
||||||
[titleView addConstraint:[NSLayoutConstraint constraintWithItem:subtitleLabel attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeBottom multiplier:1 constant:-9]];
|
[titleView addConstraint:[NSLayoutConstraint constraintWithItem:subtitleLabel attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];
|
||||||
[titleView addConstraint:[NSLayoutConstraint constraintWithItem:subtitleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
|
[titleView addConstraint:[NSLayoutConstraint constraintWithItem:subtitleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:titleView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
|
||||||
self.statusLabel = subtitleLabel;
|
self.statusLabel = subtitleLabel;
|
||||||
self.navigationItem.titleView = titleView;
|
self.navigationItem.titleView = titleView;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateTitleViewConstraints;
|
- (void)updateTitleViewConstraints {
|
||||||
{
|
|
||||||
self.titleViewWidthConstraint.constant = CGRectGetWidth(self.view.bounds);
|
self.titleViewWidthConstraint.constant = CGRectGetWidth(self.view.bounds);
|
||||||
CGFloat height = CGRectGetHeight(self.navigationController.navigationBar.bounds);
|
self.titleViewHeightConstraint.constant = 8 + CGRectGetHeight(self.navigationController.navigationBar.bounds);
|
||||||
CGFloat top = 5;
|
|
||||||
// This is more reliable than checking if it's portrait.
|
|
||||||
if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
|
|
||||||
{
|
|
||||||
// status bar
|
|
||||||
height += 20;
|
|
||||||
top += 15;
|
|
||||||
}
|
|
||||||
self.titleViewHeightConstraint.constant = height;
|
|
||||||
self.titleLabelTopConstraint.constant = top;
|
|
||||||
[self.titleLabel.superview setNeedsUpdateConstraints];
|
[self.titleLabel.superview setNeedsUpdateConstraints];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -154,6 +137,8 @@ static const NSUInteger SectionPublished = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setupBlogStatusTimer {
|
- (void)setupBlogStatusTimer {
|
||||||
|
// Just make sure everything is cleaned up in case we get called twice.
|
||||||
|
[self teardownBlogStatusTimer];
|
||||||
self.blogStatusTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateBlogStatus) userInfo:nil repeats:YES];
|
self.blogStatusTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateBlogStatus) userInfo:nil repeats:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -187,39 +172,47 @@ static const NSUInteger SectionPublished = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateBlogStatus {
|
- (void)updateBlogStatus {
|
||||||
[self updateStatusLabel:[NSString stringWithFormat:@"%@ as of %@", self.blogStatusText, [self.blogStatusDate mm_relativeToNow]] animated:NO];
|
[self updateBlogStatusAnimated:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateBlogStatusAnimated:(BOOL)animated {
|
- (void)updateBlogStatusAnimated:(BOOL)animated {
|
||||||
[self updateStatusLabel:[NSString stringWithFormat:@"%@ as of %@", self.blogStatusText, [self.blogStatusDate mm_relativeToNow]] animated:animated];
|
if (!(self.blogStatusText && self.blogStatusDate)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
NSString *status = [NSString stringWithFormat:@"%@ as of %@", self.blogStatusText, [self.blogStatusDate mm_relativeToNow]];
|
||||||
|
[self updateStatusLabel:status animated:animated];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewWillAppear:(BOOL)animated {
|
- (void)viewWillAppear:(BOOL)animated {
|
||||||
[super viewWillAppear:animated];
|
[super viewWillAppear:animated];
|
||||||
[self setupBlogStatusTimer];
|
|
||||||
[self requestStatusWithCaching:YES];
|
[self requestStatusWithCaching:YES];
|
||||||
BOOL isPhone = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone;
|
PMKPromise *postP = self.postCollections ? [PMKPromise promiseWithValue:self.postCollections] : [self requestPostsWithCaching:YES];
|
||||||
if (isPhone && self.tableView.indexPathForSelectedRow) {
|
postP.then(^{
|
||||||
[self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES];
|
if (self.selectedIndexPath && [self postForIndexPath:self.selectedIndexPath]) {
|
||||||
}
|
[self.tableView selectRowAtIndexPath:self.selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
|
||||||
if (!self.postCollections) {
|
self.selectedIndexPath = nil;
|
||||||
[self requestPostsWithCaching:YES];
|
}
|
||||||
}
|
if (self.clearsSelectionOnViewWillAppear && self.tableView.indexPathForSelectedRow) {
|
||||||
[self setupKeyboardNotifications];
|
[self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES];
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewDidAppear:(BOOL)animated {
|
- (void)viewDidAppear:(BOOL)animated {
|
||||||
[super viewDidAppear:animated];
|
[super viewDidAppear:animated];
|
||||||
|
[self setupKeyboardNotifications];
|
||||||
|
[self setupBlogStatusTimer];
|
||||||
|
|
||||||
if (!self.hasAppeared) {
|
if (!self.hasAppeared) {
|
||||||
self.hasAppeared = YES;
|
self.hasAppeared = YES;
|
||||||
[self hideSearchBarAnimated:YES];
|
[self hideSearchBarAnimated:YES];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewWillDisappear:(BOOL)animated {
|
- (void)viewDidDisappear:(BOOL)animated {
|
||||||
[super viewWillDisappear:animated];
|
[super viewWillDisappear:animated];
|
||||||
[self teardownBlogStatusTimer];
|
|
||||||
[self teardownKeyboardNotifications];
|
[self teardownKeyboardNotifications];
|
||||||
|
[self teardownBlogStatusTimer];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewDidLayoutSubviews {
|
- (void)viewDidLayoutSubviews {
|
||||||
|
|
@ -239,7 +232,6 @@ static const NSUInteger SectionPublished = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (PMKPromise *)requestStatusWithCaching:(BOOL)useCache {
|
- (PMKPromise *)requestStatusWithCaching:(BOOL)useCache {
|
||||||
[self teardownBlogStatusTimer];
|
|
||||||
[self updateStatusLabel:@"Checking status" animated:YES];
|
[self updateStatusLabel:@"Checking status" animated:YES];
|
||||||
return [self.blogController requestBlogStatusWithCaching:useCache].then(^(BlogStatus *status) {
|
return [self.blogController requestBlogStatusWithCaching:useCache].then(^(BlogStatus *status) {
|
||||||
self.blogStatusDate = status.date;
|
self.blogStatusDate = status.date;
|
||||||
|
|
@ -249,7 +241,6 @@ static const NSUInteger SectionPublished = 1;
|
||||||
else {
|
else {
|
||||||
self.blogStatusText = @"Everything published";
|
self.blogStatusText = @"Everything published";
|
||||||
}
|
}
|
||||||
[self setupBlogStatusTimer];
|
|
||||||
[self updateBlogStatusAnimated:YES];
|
[self updateBlogStatusAnimated:YES];
|
||||||
return status;
|
return status;
|
||||||
}).catch(^(NSError *error) {
|
}).catch(^(NSError *error) {
|
||||||
|
|
@ -270,11 +261,19 @@ static const NSUInteger SectionPublished = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (PostCollection *)postCollectionForSection:(NSInteger)section {
|
- (PostCollection *)postCollectionForSection:(NSInteger)section {
|
||||||
return [self collectionsForTableView][section];
|
NSArray *collections = [self collectionsForTableView];
|
||||||
|
if (section < collections.count) {
|
||||||
|
return collections[section];
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (Post *)postForIndexPath:(NSIndexPath *)indexPath {
|
- (Post *)postForIndexPath:(NSIndexPath *)indexPath {
|
||||||
return [self postCollectionForSection:indexPath.section].posts[indexPath.row];
|
PostCollection *collection = [self postCollectionForSection:indexPath.section];
|
||||||
|
if (indexPath.row < collection.posts.count) {
|
||||||
|
return collection.posts[indexPath.row];
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSMutableArray *)drafts {
|
- (NSMutableArray *)drafts {
|
||||||
|
|
@ -487,8 +486,6 @@ static const NSUInteger SectionPublished = 1;
|
||||||
EditorViewController *controller = (EditorViewController *)[[segue destinationViewController] topViewController];
|
EditorViewController *controller = (EditorViewController *)[[segue destinationViewController] topViewController];
|
||||||
controller.blogController = self.blogController;
|
controller.blogController = self.blogController;
|
||||||
[controller configureWithPost:post];
|
[controller configureWithPost:post];
|
||||||
controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
|
|
||||||
controller.navigationItem.leftItemsSupplementBackButton = YES;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -496,16 +493,19 @@ static const NSUInteger SectionPublished = 1;
|
||||||
|
|
||||||
static NSString *const StateRestorationBlogStatusDateKey = @"blogStatusDate";
|
static NSString *const StateRestorationBlogStatusDateKey = @"blogStatusDate";
|
||||||
static NSString *const StateRestorationBlogStatusTextKey = @"blogStatusText";
|
static NSString *const StateRestorationBlogStatusTextKey = @"blogStatusText";
|
||||||
|
static NSString *const StateRestorationTableViewSelectedIndexPathKey = @"tableView.indexPathForSelectedRow";
|
||||||
|
|
||||||
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
|
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
|
||||||
[coder encodeObject:self.blogStatusDate forKey:StateRestorationBlogStatusDateKey];
|
[coder encodeObject:self.blogStatusDate forKey:StateRestorationBlogStatusDateKey];
|
||||||
[coder encodeObject:self.blogStatusText forKey:StateRestorationBlogStatusTextKey];
|
[coder encodeObject:self.blogStatusText forKey:StateRestorationBlogStatusTextKey];
|
||||||
|
[coder encodeObject:self.tableView.indexPathForSelectedRow forKey:StateRestorationTableViewSelectedIndexPathKey];
|
||||||
[super encodeRestorableStateWithCoder:coder];
|
[super encodeRestorableStateWithCoder:coder];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
|
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
|
||||||
self.blogStatusDate = [coder decodeObjectForKey:StateRestorationBlogStatusDateKey];
|
self.blogStatusDate = [coder decodeObjectForKey:StateRestorationBlogStatusDateKey];
|
||||||
self.blogStatusText = [coder decodeObjectForKey:StateRestorationBlogStatusTextKey];
|
self.blogStatusText = [coder decodeObjectForKey:StateRestorationBlogStatusTextKey];
|
||||||
|
self.selectedIndexPath = [coder decodeObjectForKey:StateRestorationTableViewSelectedIndexPathKey];
|
||||||
[super decodeRestorableStateWithCoder:coder];
|
[super decodeRestorableStateWithCoder:coder];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)rootURL {
|
- (NSString *)rootURL {
|
||||||
return @"http://ocean.samhuri.net:6706/";
|
return @"https://ocean.samhuri.net/";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BlogController *)blogController {
|
- (BlogController *)blogController {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>ca.gurulogic.$(PRODUCT_NAME:rfc1034identifier)</string>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
|
|
|
||||||
2
Podfile
2
Podfile
|
|
@ -20,9 +20,7 @@ target :Blog do
|
||||||
pod 'dyci'
|
pod 'dyci'
|
||||||
pod 'FontAwesome+iOS', :git => 'https://github.com/alexdrone/ios-fontawesome.git'
|
pod 'FontAwesome+iOS', :git => 'https://github.com/alexdrone/ios-fontawesome.git'
|
||||||
pod 'MBProgressHUD'
|
pod 'MBProgressHUD'
|
||||||
pod 'HockeySDK'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
target :BlogTests do
|
target :BlogTests do
|
||||||
link_with :Blog
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ PODS:
|
||||||
- dyci/Injections (= 0.1.5.6)
|
- dyci/Injections (= 0.1.5.6)
|
||||||
- dyci/Injections (0.1.5.6)
|
- dyci/Injections (0.1.5.6)
|
||||||
- FontAwesome+iOS (0.0.1)
|
- FontAwesome+iOS (0.0.1)
|
||||||
- HockeySDK (3.6.4)
|
|
||||||
- libextobjc (0.4.1):
|
- libextobjc (0.4.1):
|
||||||
- libextobjc/EXTADT (= 0.4.1)
|
- libextobjc/EXTADT (= 0.4.1)
|
||||||
- libextobjc/EXTConcreteProtocol (= 0.4.1)
|
- libextobjc/EXTConcreteProtocol (= 0.4.1)
|
||||||
|
|
@ -100,7 +99,6 @@ PODS:
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- dyci
|
- dyci
|
||||||
- FontAwesome+iOS (from `https://github.com/alexdrone/ios-fontawesome.git`)
|
- FontAwesome+iOS (from `https://github.com/alexdrone/ios-fontawesome.git`)
|
||||||
- HockeySDK
|
|
||||||
- libextobjc
|
- libextobjc
|
||||||
- Mantle
|
- Mantle
|
||||||
- MBProgressHUD
|
- MBProgressHUD
|
||||||
|
|
@ -121,7 +119,6 @@ SPEC CHECKSUMS:
|
||||||
CocoaLumberjack: 628fca2e88ef06f7cf6817309aa405f325d9a6fa
|
CocoaLumberjack: 628fca2e88ef06f7cf6817309aa405f325d9a6fa
|
||||||
dyci: 099c2e6dc98abb8f21b370cabbf1443ff700608a
|
dyci: 099c2e6dc98abb8f21b370cabbf1443ff700608a
|
||||||
FontAwesome+iOS: c6d3bbd2856b9633028d316d56133d45fb6a6cb0
|
FontAwesome+iOS: c6d3bbd2856b9633028d316d56133d45fb6a6cb0
|
||||||
HockeySDK: c07cdd580296737edcd0963e292c19885a53f563
|
|
||||||
libextobjc: a650fc1bf489a3d3a9bc2e621efa3e1006fc5471
|
libextobjc: a650fc1bf489a3d3a9bc2e621efa3e1006fc5471
|
||||||
Mantle: d7c75b6fb789b20f7ae30cd0d09435fe545896ff
|
Mantle: d7c75b6fb789b20f7ae30cd0d09435fe545896ff
|
||||||
MBProgressHUD: c47f2c166c126cf2ce36498d80f33e754d4e93ad
|
MBProgressHUD: c47f2c166c126cf2ce36498d80f33e754d4e93ad
|
||||||
|
|
@ -130,4 +127,4 @@ SPEC CHECKSUMS:
|
||||||
PromiseKit: b333c1baae651ed1fdfb4f6f4ef18d7ca118931e
|
PromiseKit: b333c1baae651ed1fdfb4f6f4ef18d7ca118931e
|
||||||
YapDatabase: 13566c87dc9226a0f15d755edba08e8ad94cac9f
|
YapDatabase: 13566c87dc9226a0f15d755edba08e8ad94cac9f
|
||||||
|
|
||||||
COCOAPODS: 0.37.1
|
COCOAPODS: 0.37.2
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITActivityIndicatorButton.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAppStoreHeader.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAppVersionMetaInfo.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITArrowImageAnnotation.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAttributedLabel.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAuthenticationViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAuthenticator.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAuthenticator_Private.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITBlurImageAnnotation.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashAttachment.h
|
|
||||||
1
Pods/Headers/Private/HockeySDK/BITCrashDetails.h
generated
1
Pods/Headers/Private/HockeySDK/BITCrashDetails.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashDetails.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashDetailsPrivate.h
|
|
||||||
1
Pods/Headers/Private/HockeySDK/BITCrashManager.h
generated
1
Pods/Headers/Private/HockeySDK/BITCrashManager.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashManagerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashManagerPrivate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashMetaData.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashReportTextFormatter.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackActivity.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackComposeViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackComposeViewControllerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackListViewCell.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackListViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackManagerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackManagerPrivate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackMessage.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackMessageAttachment.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackUserDataViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHTTPOperation.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyAppClient.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyAttachment.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyBaseManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyBaseManagerPrivate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyBaseViewController.h
|
|
||||||
1
Pods/Headers/Private/HockeySDK/BITHockeyHelper.h
generated
1
Pods/Headers/Private/HockeySDK/BITHockeyHelper.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyHelper.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyManagerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITImageAnnotation.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITImageAnnotationViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITKeychainUtils.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITRectangleImageAnnotation.h
|
|
||||||
1
Pods/Headers/Private/HockeySDK/BITStoreButton.h
generated
1
Pods/Headers/Private/HockeySDK/BITStoreButton.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITStoreButton.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITStoreUpdateManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITStoreUpdateManagerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITStoreUpdateManagerPrivate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITUpdateManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITUpdateManagerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITUpdateManagerPrivate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITUpdateViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITUpdateViewControllerPrivate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITWebTableViewCell.h
|
|
||||||
1
Pods/Headers/Private/HockeySDK/HockeySDK.h
generated
1
Pods/Headers/Private/HockeySDK/HockeySDK.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/HockeySDK.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/HockeySDKFeatureConfig.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/HockeySDKPrivate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITActivityIndicatorButton.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAppStoreHeader.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAppVersionMetaInfo.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITArrowImageAnnotation.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAttributedLabel.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAuthenticationViewController.h
|
|
||||||
1
Pods/Headers/Public/HockeySDK/BITAuthenticator.h
generated
1
Pods/Headers/Public/HockeySDK/BITAuthenticator.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITAuthenticator.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITBlurImageAnnotation.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashAttachment.h
|
|
||||||
1
Pods/Headers/Public/HockeySDK/BITCrashDetails.h
generated
1
Pods/Headers/Public/HockeySDK/BITCrashDetails.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashDetails.h
|
|
||||||
1
Pods/Headers/Public/HockeySDK/BITCrashManager.h
generated
1
Pods/Headers/Public/HockeySDK/BITCrashManager.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashManagerDelegate.h
|
|
||||||
1
Pods/Headers/Public/HockeySDK/BITCrashMetaData.h
generated
1
Pods/Headers/Public/HockeySDK/BITCrashMetaData.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashMetaData.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITCrashReportTextFormatter.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackActivity.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackComposeViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackComposeViewControllerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackListViewCell.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackListViewController.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackManagerDelegate.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackMessage.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackMessageAttachment.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITFeedbackUserDataViewController.h
|
|
||||||
1
Pods/Headers/Public/HockeySDK/BITHTTPOperation.h
generated
1
Pods/Headers/Public/HockeySDK/BITHTTPOperation.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHTTPOperation.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyAppClient.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyAttachment.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyBaseManager.h
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyBaseViewController.h
|
|
||||||
1
Pods/Headers/Public/HockeySDK/BITHockeyHelper.h
generated
1
Pods/Headers/Public/HockeySDK/BITHockeyHelper.h
generated
|
|
@ -1 +0,0 @@
|
||||||
../../../HockeySDK/Classes/BITHockeyHelper.h
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue