4 Commits

Author SHA1 Message Date
Dhaval Thanki cd2f33cff6 Update README.md 2022-01-24 12:04:52 +05:30
Dhaval Thanki 0783b82094 Version 0.7.0 release 2022-01-23 23:23:32 +05:30
Dhaval Thanki eab1bf4f68 Update README.md 2022-01-23 22:55:37 +05:30
Dhaval Thanki 2083565137 errorTextColor property added to change error label text color
DTTextField framework created
2022-01-23 14:25:00 +05:30
11 changed files with 504 additions and 541 deletions
+4 -4
View File
@@ -9,7 +9,7 @@
Pod::Spec.new do |s|
s.name = 'DTTextField'
s.version = '0.5.0'
s.version = '0.7.0'
s.summary = 'DTTextField is UITextField library.'
s.description = <<-DESC
@@ -18,11 +18,11 @@ DTTextField is UITextField library with floating and error label.
s.homepage = 'https://github.com/iDhaval/DTTextField'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Dhaval Thanki' => 'dhaval.thanki@gmail.com' }
s.source = { :git => 'https://github.com/iDhaval/DTTextField.git', :tag => s.version.to_s }
s.author = { 'Dhaval Thanki' => 'dhavaldthanki@gmail.com' }
s.source = { :git => 'https://github.com/iDhaval/DTTextField.git', :tag => s.version }
s.ios.deployment_target = '9.0'
s.swift_version = '5.0'
s.source_files = 'Sources/DTTextField/**/*'
s.frameworks = 'UIKit'
+366
View File
@@ -0,0 +1,366 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
0E6BCA66279D30400067A19F /* DTTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E6BCA65279D30400067A19F /* DTTextField.h */; settings = {ATTRIBUTES = (Public, ); }; };
0E6BCB51279D41F00067A19F /* DTTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E6BCB50279D41F00067A19F /* DTTextField.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
0E6BCA62279D30400067A19F /* DTTextField.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DTTextField.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0E6BCA65279D30400067A19F /* DTTextField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DTTextField.h; sourceTree = "<group>"; };
0E6BCB50279D41F00067A19F /* DTTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DTTextField.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
0E6BCA5F279D30400067A19F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0E6BCA58279D30400067A19F = {
isa = PBXGroup;
children = (
0E6BCB4E279D41F00067A19F /* Sources */,
0E6BCA64279D30400067A19F /* DTTextField */,
0E6BCA63279D30400067A19F /* Products */,
);
sourceTree = "<group>";
};
0E6BCA63279D30400067A19F /* Products */ = {
isa = PBXGroup;
children = (
0E6BCA62279D30400067A19F /* DTTextField.framework */,
);
name = Products;
sourceTree = "<group>";
};
0E6BCA64279D30400067A19F /* DTTextField */ = {
isa = PBXGroup;
children = (
0E6BCA65279D30400067A19F /* DTTextField.h */,
);
path = DTTextField;
sourceTree = "<group>";
};
0E6BCB4E279D41F00067A19F /* Sources */ = {
isa = PBXGroup;
children = (
0E6BCB4F279D41F00067A19F /* DTTextField */,
);
path = Sources;
sourceTree = "<group>";
};
0E6BCB4F279D41F00067A19F /* DTTextField */ = {
isa = PBXGroup;
children = (
0E6BCB50279D41F00067A19F /* DTTextField.swift */,
);
path = DTTextField;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
0E6BCA5D279D30400067A19F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
0E6BCA66279D30400067A19F /* DTTextField.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
0E6BCA61279D30400067A19F /* DTTextField */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0E6BCA69279D30400067A19F /* Build configuration list for PBXNativeTarget "DTTextField" */;
buildPhases = (
0E6BCA5D279D30400067A19F /* Headers */,
0E6BCA5E279D30400067A19F /* Sources */,
0E6BCA5F279D30400067A19F /* Frameworks */,
0E6BCA60279D30400067A19F /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = DTTextField;
productName = DTTextField;
productReference = 0E6BCA62279D30400067A19F /* DTTextField.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0E6BCA59279D30400067A19F /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastUpgradeCheck = 1320;
TargetAttributes = {
0E6BCA61279D30400067A19F = {
CreatedOnToolsVersion = 13.2.1;
};
};
};
buildConfigurationList = 0E6BCA5C279D30400067A19F /* Build configuration list for PBXProject "DTTextField" */;
compatibilityVersion = "Xcode 13.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 0E6BCA58279D30400067A19F;
productRefGroup = 0E6BCA63279D30400067A19F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
0E6BCA61279D30400067A19F /* DTTextField */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
0E6BCA60279D30400067A19F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
0E6BCA5E279D30400067A19F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0E6BCB51279D41F00067A19F /* DTTextField.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
0E6BCA67279D30400067A19F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
0E6BCA68279D30400067A19F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.2;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
0E6BCA6A279D30400067A19F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = XDZ4VN9T5R;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.dhaval.DTTextField;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = NO;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
0E6BCA6B279D30400067A19F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = XDZ4VN9T5R;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.dhaval.DTTextField;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = NO;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
0E6BCA5C279D30400067A19F /* Build configuration list for PBXProject "DTTextField" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0E6BCA67279D30400067A19F /* Debug */,
0E6BCA68279D30400067A19F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
0E6BCA69279D30400067A19F /* Build configuration list for PBXNativeTarget "DTTextField" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0E6BCA6A279D30400067A19F /* Debug */,
0E6BCA6B279D30400067A19F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 0E6BCA59279D30400067A19F /* Project object */;
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
+18
View File
@@ -0,0 +1,18 @@
//
// DTTextField.h
// DTTextField
//
// Created by Dhaval Thanki on 23/01/22.
//
#import <Foundation/Foundation.h>
//! Project version number for DTTextField.
FOUNDATION_EXPORT double DTTextFieldVersionNumber;
//! Project version string for DTTextField.
FOUNDATION_EXPORT const unsigned char DTTextFieldVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <DTTextField/PublicHeader.h>
+80 -10
View File
@@ -3,10 +3,12 @@
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
0E6BCA7B279D33D30067A19F /* DTTextField.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E6BCA79279D335B0067A19F /* DTTextField.framework */; platformFilter = ios; };
0E6BCA7C279D33D30067A19F /* DTTextField.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0E6BCA79279D335B0067A19F /* DTTextField.framework */; platformFilter = ios; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
0EBDB911205BD7EA001E212E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0EBDB90F205BD7EA001E212E /* Localizable.strings */; };
607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; };
607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; };
@@ -14,10 +16,16 @@
607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; };
607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; };
607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; };
F20EFAF71ED7136A00DE8008 /* DTTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F20EFAF61ED7136A00DE8008 /* DTTextField.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
0E6BCA78279D335B0067A19F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0E6BCA74279D335B0067A19F /* DTTextField.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 0E6BCA62279D30400067A19F;
remoteInfo = DTTextField;
};
607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 607FACC81AFB9204008FA782 /* Project object */;
@@ -27,7 +35,22 @@
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
0E6BCA7D279D33D30067A19F /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
0E6BCA7C279D33D30067A19F /* DTTextField.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0E6BCA74279D335B0067A19F /* DTTextField.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = DTTextField.xcodeproj; path = ../DTTextField.xcodeproj; sourceTree = "<group>"; };
0EBDB903205BCB1C001E212E /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Main.strings; sourceTree = "<group>"; };
0EBDB904205BCB1C001E212E /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
0EBDB912205BD7EE001E212E /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -42,7 +65,6 @@
607FACE51AFB9204008FA782 /* DTTextField_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DTTextField_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = "<group>"; };
F20EFAF61ED7136A00DE8008 /* DTTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DTTextField.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -50,6 +72,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0E6BCA7B279D33D30067A19F /* DTTextField.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -63,12 +86,29 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0E6BCA75279D335B0067A19F /* Products */ = {
isa = PBXGroup;
children = (
0E6BCA79279D335B0067A19F /* DTTextField.framework */,
);
name = Products;
sourceTree = "<group>";
};
0E6BCA7A279D33D30067A19F /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
607FACC71AFB9204008FA782 = {
isa = PBXGroup;
children = (
0E6BCA74279D335B0067A19F /* DTTextField.xcodeproj */,
607FACD21AFB9204008FA782 /* Example for DTTextField */,
607FACE81AFB9204008FA782 /* Tests */,
607FACD11AFB9204008FA782 /* Products */,
0E6BCA7A279D33D30067A19F /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -85,7 +125,6 @@
isa = PBXGroup;
children = (
0EBDB90F205BD7EA001E212E /* Localizable.strings */,
F20EFAF61ED7136A00DE8008 /* DTTextField.swift */,
607FACD51AFB9204008FA782 /* AppDelegate.swift */,
607FACD71AFB9204008FA782 /* ViewController.swift */,
607FACD91AFB9204008FA782 /* Main.storyboard */,
@@ -132,6 +171,7 @@
607FACCC1AFB9204008FA782 /* Sources */,
607FACCD1AFB9204008FA782 /* Frameworks */,
607FACCE1AFB9204008FA782 /* Resources */,
0E6BCA7D279D33D30067A19F /* Embed Frameworks */,
);
buildRules = (
);
@@ -195,6 +235,12 @@
mainGroup = 607FACC71AFB9204008FA782;
productRefGroup = 607FACD11AFB9204008FA782 /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 0E6BCA75279D335B0067A19F /* Products */;
ProjectRef = 0E6BCA74279D335B0067A19F /* DTTextField.xcodeproj */;
},
);
projectRoot = "";
targets = (
607FACCF1AFB9204008FA782 /* DTTextField_Example */,
@@ -203,6 +249,16 @@
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
0E6BCA79279D335B0067A19F /* DTTextField.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = DTTextField.framework;
remoteRef = 0E6BCA78279D335B0067A19F /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
607FACCE1AFB9204008FA782 /* Resources */ = {
isa = PBXResourcesBuildPhase;
@@ -229,7 +285,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F20EFAF71ED7136A00DE8008 /* DTTextField.swift in Sources */,
607FACD81AFB9204008FA782 /* ViewController.swift in Sources */,
607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */,
);
@@ -368,7 +423,8 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
@@ -380,7 +436,10 @@
DEVELOPMENT_TEAM = XDZ4VN9T5R;
INFOPLIST_FILE = DTTextField/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MODULE_NAME = ExampleApp;
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.DTTextField-Example1";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -395,7 +454,10 @@
DEVELOPMENT_TEAM = XDZ4VN9T5R;
INFOPLIST_FILE = DTTextField/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MODULE_NAME = ExampleApp;
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.DTTextField-Example1";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -415,7 +477,11 @@
"$(inherited)",
);
INFOPLIST_FILE = Tests/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 = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
@@ -430,7 +496,11 @@
"$(inherited)",
);
INFOPLIST_FILE = Tests/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 = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="Kzc-T6-rcN">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="Kzc-T6-rcN">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15509"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
@@ -25,34 +25,34 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="T5N-VG-n0n">
<rect key="frame" x="0.0" y="0.0" width="375" height="623"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="First Name" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="LZk-sC-XSt" customClass="DTTextField" customModule="DTTextField_Example" customModuleProvider="target">
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="First Name" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="LZk-sC-XSt" customClass="DTTextField" customModule="DTTextField">
<rect key="frame" x="16" y="50" width="343" height="34"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Last Name" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ZMK-KE-9Cc" customClass="DTTextField" customModule="DTTextField_Example" customModuleProvider="target">
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Last Name" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ZMK-KE-9Cc" customClass="DTTextField" customModule="DTTextField">
<rect key="frame" x="16" y="92" width="343" height="34"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Vp4-XI-7k7">
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Vp4-XI-7k7">
<rect key="frame" x="159" y="262" width="57" height="30"/>
<state key="normal" title="Register"/>
<connections>
<action selector="onBtnSubmitClicked:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="vbi-gx-VFd"/>
</connections>
</button>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Email" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="G8b-0H-NOp" customClass="DTTextField" customModule="DTTextField_Example" customModuleProvider="target">
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Email" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="G8b-0H-NOp" customClass="DTTextField" customModule="DTTextField">
<rect key="frame" x="16" y="134" width="343" height="34"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="vOV-P3-5my" customClass="DTTextField" customModule="DTTextField_Example" customModuleProvider="target">
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="vOV-P3-5my" customClass="DTTextField" customModule="DTTextField">
<rect key="frame" x="16" y="176" width="343" height="34"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Confirm Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="oVW-xu-ETH" customClass="DTTextField" customModule="DTTextField_Example" customModuleProvider="target">
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Confirm Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="oVW-xu-ETH" customClass="DTTextField" customModule="DTTextField">
<rect key="frame" x="16" y="218" width="343" height="34"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
-516
View File
@@ -1,516 +0,0 @@
//
// DTTextField.swift
// Pods
//
// Created by Dhaval Thanki on 03/04/17.
//
//
import Foundation
import UIKit
public extension String {
var isEmptyStr:Bool{
return self.trimmingCharacters(in: NSCharacterSet.whitespaces).isEmpty
}
}
public class DTTextField: UITextField {
public enum FloatingDisplayStatus{
case always
case never
case defaults
}
public enum DTBorderStyle{
case none
case rounded
case sqare
case top
case bottom
case left
case right
}
fileprivate var lblFloatPlaceholder:UILabel = UILabel()
fileprivate var lblError:UILabel = UILabel()
fileprivate let paddingX:CGFloat = 5.0
fileprivate let paddingHeight:CGFloat = 10.0
fileprivate var borderLayer:CALayer = CALayer()
public var dtLayer:CALayer = CALayer()
public var floatPlaceholderColor:UIColor = UIColor.black
public var floatPlaceholderActiveColor:UIColor = UIColor.black
public var floatingLabelShowAnimationDuration = 0.3
public var floatingDisplayStatus:FloatingDisplayStatus = .defaults
public var borderWidth:CGFloat = 0.5{
didSet{
let borderStyle = dtborderStyle;
dtborderStyle = borderStyle
}
}
public var dtborderStyle:DTBorderStyle = .rounded{
didSet{
borderLayer.removeFromSuperlayer()
switch dtborderStyle {
case .none:
dtLayer.cornerRadius = 0.0
dtLayer.borderWidth = 0.0
case .rounded:
dtLayer.cornerRadius = 4.5
dtLayer.borderWidth = borderWidth
dtLayer.borderColor = borderColor.cgColor
case .sqare:
dtLayer.cornerRadius = 0.0
dtLayer.borderWidth = borderWidth
dtLayer.borderColor = borderColor.cgColor
case .bottom,.left,.right,.top:
dtLayer.cornerRadius = 0.0
dtLayer.borderWidth = 0.0
borderLayer.backgroundColor = borderColor.cgColor
if dtborderStyle == .bottom {
borderLayer.frame = CGRect(x: 0, y: dtLayer.bounds.size.height - borderWidth, width: dtLayer.bounds.size.width, height: borderWidth)
}else if dtborderStyle == .left{
borderLayer.frame = CGRect(x: 0, y: 0, width: borderWidth, height: dtLayer.bounds.size.height)
}else if dtborderStyle == .right{
borderLayer.frame = CGRect(x: dtLayer.bounds.size.width - borderWidth, y: 0, width: borderWidth, height: dtLayer.bounds.size.height)
}else{
borderLayer.frame = CGRect(x: 0, y: 0, width: dtLayer.bounds.size.width, height: borderWidth)
}
dtLayer.addSublayer(borderLayer)
}
}
}
public var errorMessage:String = ""{
didSet{ lblError.text = errorMessage }
}
public var animateFloatPlaceholder:Bool = true
public var hideErrorWhenEditing:Bool = true
public var errorFont = UIFont.systemFont(ofSize: 10.0){
didSet{
lblError.font = errorFont
invalidateIntrinsicContentSize()
}
}
public var floatPlaceholderFont = UIFont.systemFont(ofSize: 10.0){
didSet{
lblFloatPlaceholder.font = floatPlaceholderFont
invalidateIntrinsicContentSize()
}
}
public var paddingYFloatLabel:CGFloat = 3.0{
didSet{ invalidateIntrinsicContentSize() }
}
public var paddingYErrorLabel:CGFloat = 3.0{
didSet{ invalidateIntrinsicContentSize() }
}
public var borderColor:UIColor = UIColor(red: 204.0/255.0, green: 204.0/255.0, blue: 204.0/255.0, alpha: 1.0){
didSet{
switch dtborderStyle {
case .none,.rounded,.sqare:
dtLayer.borderColor = borderColor.cgColor
case .bottom,.right,.top,.left:
borderLayer.backgroundColor = borderColor.cgColor
}
}
}
public var canShowBorder:Bool = true{
didSet{
switch dtborderStyle {
case .none,.rounded,.sqare:
dtLayer.isHidden = !canShowBorder
case .bottom,.right,.top,.left:
borderLayer.isHidden = !canShowBorder
}
}
}
public var placeholderColor:UIColor?{
didSet{
guard let color = placeholderColor else { return }
attributedPlaceholder = NSAttributedString(string: placeholderFinal,
attributes: [NSAttributedString.Key.foregroundColor:color])
}
}
fileprivate var x:CGFloat {
if let leftView = leftView {
return leftView.frame.origin.x + leftView.bounds.size.width - paddingX
}
return paddingX
}
fileprivate var fontHeight:CGFloat{
return ceil(font!.lineHeight)
}
fileprivate var dtLayerHeight:CGFloat{
return showErrorLabel ? floor(bounds.height - lblError.bounds.size.height - paddingYErrorLabel) : bounds.height
}
fileprivate var floatLabelWidth:CGFloat{
var width = bounds.size.width
if let leftViewWidth = leftView?.bounds.size.width{
width -= leftViewWidth
}
if let rightViewWidth = rightView?.bounds.size.width {
width -= rightViewWidth
}
return width - (self.x * 2)
}
fileprivate var placeholderFinal:String{
if let attributed = attributedPlaceholder { return attributed.string }
return placeholder ?? " "
}
fileprivate var isFloatLabelShowing:Bool = false
fileprivate var showErrorLabel:Bool = false{
didSet{
guard showErrorLabel != oldValue else { return }
guard showErrorLabel else {
hideErrorMessage()
return
}
guard !errorMessage.isEmptyStr else { return }
showErrorMessage()
}
}
override public var borderStyle: UITextField.BorderStyle{
didSet{
guard borderStyle != oldValue else { return }
borderStyle = .none
}
}
public override var textAlignment: NSTextAlignment{
didSet{ setNeedsLayout() }
}
public override var text: String?{
didSet{ self.textFieldTextChanged() }
}
override public var placeholder: String?{
didSet{
guard let color = placeholderColor else {
lblFloatPlaceholder.text = placeholderFinal
return
}
attributedPlaceholder = NSAttributedString(string: placeholderFinal,
attributes: [NSAttributedString.Key.foregroundColor:color])
}
}
override public var attributedPlaceholder: NSAttributedString?{
didSet{ lblFloatPlaceholder.text = placeholderFinal }
}
override public init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
public func showError(message:String? = nil) {
if let msg = message { errorMessage = msg }
showErrorLabel = true
}
public func hideError() {
showErrorLabel = false
}
fileprivate func commonInit() {
dtborderStyle = .rounded
dtLayer.backgroundColor = UIColor.white.cgColor
floatPlaceholderColor = UIColor(red: 204.0/255.0, green: 204.0/255.0, blue: 204.0/255.0, alpha: 1.0)
floatPlaceholderActiveColor = tintColor
lblFloatPlaceholder.frame = CGRect.zero
lblFloatPlaceholder.alpha = 0.0
lblFloatPlaceholder.font = floatPlaceholderFont
lblFloatPlaceholder.text = placeholderFinal
addSubview(lblFloatPlaceholder)
lblError.frame = CGRect.zero
lblError.font = errorFont
lblError.textColor = UIColor.red
lblError.numberOfLines = 0
lblError.isHidden = true
addTarget(self, action: #selector(textFieldTextChanged), for: .editingChanged)
addSubview(lblError)
layer.insertSublayer(dtLayer, at: 0)
}
fileprivate func showErrorMessage(){
lblError.text = errorMessage
lblError.isHidden = false
let boundWithPadding = CGSize(width: bounds.width - (paddingX * 2), height: bounds.height)
lblError.frame = CGRect(x: paddingX, y: 0, width: boundWithPadding.width, height: boundWithPadding.height)
lblError.sizeToFit()
invalidateIntrinsicContentSize()
}
func setErrorLabelAlignment() {
var newFrame = lblError.frame
if textAlignment == .right {
newFrame.origin.x = bounds.width - paddingX - newFrame.size.width
}else if textAlignment == .left{
newFrame.origin.x = paddingX
}else if textAlignment == .center{
newFrame.origin.x = (bounds.width / 2.0) - (newFrame.size.width / 2.0)
}else if textAlignment == .natural{
if UIView.userInterfaceLayoutDirection(for: semanticContentAttribute) == .rightToLeft{
newFrame.origin.x = bounds.width - paddingX - newFrame.size.width
}
}
lblError.frame = newFrame
}
func setFloatLabelAlignment() {
var newFrame = lblFloatPlaceholder.frame
if textAlignment == .right {
newFrame.origin.x = bounds.width - paddingX - newFrame.size.width
}else if textAlignment == .left{
newFrame.origin.x = paddingX
}else if textAlignment == .center{
newFrame.origin.x = (bounds.width / 2.0) - (newFrame.size.width / 2.0)
}else if textAlignment == .natural{
if UIView.userInterfaceLayoutDirection(for: semanticContentAttribute) == .rightToLeft{
newFrame.origin.x = bounds.width - paddingX - newFrame.size.width
}
}
lblFloatPlaceholder.frame = newFrame
}
fileprivate func hideErrorMessage(){
lblError.text = ""
lblError.isHidden = true
lblError.frame = CGRect.zero
invalidateIntrinsicContentSize()
}
fileprivate func showFloatingLabel(_ animated:Bool) {
let animations:(()->()) = {
self.lblFloatPlaceholder.alpha = 1.0
self.lblFloatPlaceholder.frame = CGRect(x: self.lblFloatPlaceholder.frame.origin.x,
y: self.paddingYFloatLabel,
width: self.lblFloatPlaceholder.bounds.size.width,
height: self.lblFloatPlaceholder.bounds.size.height)
}
if animated && animateFloatPlaceholder {
UIView.animate(withDuration: floatingLabelShowAnimationDuration,
delay: 0.0,
options: [.beginFromCurrentState,.curveEaseOut],
animations: animations){ status in
DispatchQueue.main.async {
self.layoutIfNeeded()
}
}
}else{
animations()
}
}
fileprivate func hideFlotingLabel(_ animated:Bool) {
let animations:(()->()) = {
self.lblFloatPlaceholder.alpha = 0.0
self.lblFloatPlaceholder.frame = CGRect(x: self.lblFloatPlaceholder.frame.origin.x,
y: self.lblFloatPlaceholder.font.lineHeight,
width: self.lblFloatPlaceholder.bounds.size.width,
height: self.lblFloatPlaceholder.bounds.size.height)
}
if animated && animateFloatPlaceholder {
UIView.animate(withDuration: floatingLabelShowAnimationDuration,
delay: 0.0,
options: [.beginFromCurrentState,.curveEaseOut],
animations: animations){ status in
DispatchQueue.main.async {
self.layoutIfNeeded()
}
}
}else{
animations()
}
}
fileprivate func insetRectForEmptyBounds(rect:CGRect) -> CGRect{
let newX = x
guard showErrorLabel else { return CGRect(x: newX, y: 0, width: rect.width - newX - paddingX, height: rect.height) }
let topInset = (rect.size.height - lblError.bounds.size.height - paddingYErrorLabel - fontHeight) / 2.0
let textY = topInset - ((rect.height - fontHeight) / 2.0)
return CGRect(x: newX, y: floor(textY), width: rect.size.width - newX - paddingX, height: rect.size.height)
}
fileprivate func insetRectForBounds(rect:CGRect) -> CGRect {
guard let placeholderText = lblFloatPlaceholder.text,!placeholderText.isEmptyStr else {
return insetRectForEmptyBounds(rect: rect)
}
if floatingDisplayStatus == .never {
return insetRectForEmptyBounds(rect: rect)
}else{
if let text = text,text.isEmptyStr && floatingDisplayStatus == .defaults {
return insetRectForEmptyBounds(rect: rect)
}else{
let topInset = paddingYFloatLabel + lblFloatPlaceholder.bounds.size.height + (paddingHeight / 2.0)
let textOriginalY = (rect.height - fontHeight) / 2.0
var textY = topInset - textOriginalY
if textY < 0 && !showErrorLabel { textY = topInset }
let newX = x
return CGRect(x: newX, y: ceil(textY), width: rect.size.width - newX - paddingX, height: rect.height)
}
}
}
@objc fileprivate func textFieldTextChanged(){
guard hideErrorWhenEditing && showErrorLabel else { return }
showErrorLabel = false
}
override public var intrinsicContentSize: CGSize{
self.layoutIfNeeded()
let textFieldIntrinsicContentSize = super.intrinsicContentSize
if showErrorLabel {
lblFloatPlaceholder.sizeToFit()
return CGSize(width: textFieldIntrinsicContentSize.width,
height: textFieldIntrinsicContentSize.height + paddingYFloatLabel + paddingYErrorLabel + lblFloatPlaceholder.bounds.size.height + lblError.bounds.size.height + paddingHeight)
}else{
return CGSize(width: textFieldIntrinsicContentSize.width,
height: textFieldIntrinsicContentSize.height + paddingYFloatLabel + lblFloatPlaceholder.bounds.size.height + paddingHeight)
}
}
override public func textRect(forBounds bounds: CGRect) -> CGRect {
let rect = super.textRect(forBounds: bounds)
return insetRectForBounds(rect: rect)
}
override public func editingRect(forBounds bounds: CGRect) -> CGRect {
let rect = super.editingRect(forBounds: bounds)
return insetRectForBounds(rect: rect)
}
fileprivate func insetForSideView(forBounds bounds: CGRect) -> CGRect{
var rect = bounds
rect.origin.y = 0
rect.size.height = dtLayerHeight
return rect
}
override public func leftViewRect(forBounds bounds: CGRect) -> CGRect {
let rect = super.leftViewRect(forBounds: bounds)
return insetForSideView(forBounds: rect)
}
override public func rightViewRect(forBounds bounds: CGRect) -> CGRect {
let rect = super.rightViewRect(forBounds: bounds)
return insetForSideView(forBounds: rect)
}
override public func clearButtonRect(forBounds bounds: CGRect) -> CGRect {
var rect = super.clearButtonRect(forBounds: bounds)
rect.origin.y = (dtLayerHeight - rect.size.height) / 2
return rect
}
override public func layoutSubviews() {
super.layoutSubviews()
CATransaction.begin()
CATransaction.setDisableActions(true)
dtLayer.frame = CGRect(x: bounds.origin.x,
y: bounds.origin.y,
width: bounds.width,
height: dtLayerHeight)
let borderStype = dtborderStyle
dtborderStyle = borderStype
CATransaction.commit()
if showErrorLabel {
var lblErrorFrame = lblError.frame
lblErrorFrame.origin.y = dtLayer.frame.origin.y + dtLayer.frame.size.height + paddingYErrorLabel
lblError.frame = lblErrorFrame
}
let floatingLabelSize = lblFloatPlaceholder.sizeThatFits(lblFloatPlaceholder.superview!.bounds.size)
lblFloatPlaceholder.frame = CGRect(x: x, y: lblFloatPlaceholder.frame.origin.y,
width: floatingLabelSize.width,
height: floatingLabelSize.height)
setErrorLabelAlignment()
setFloatLabelAlignment()
lblFloatPlaceholder.textColor = isFirstResponder ? floatPlaceholderActiveColor : floatPlaceholderColor
switch floatingDisplayStatus {
case .never:
hideFlotingLabel(isFirstResponder)
case .always:
showFloatingLabel(isFirstResponder)
default:
if let enteredText = text,!enteredText.isEmptyStr{
showFloatingLabel(isFirstResponder)
}else{
hideFlotingLabel(isFirstResponder)
}
}
}
}
+1
View File
@@ -7,6 +7,7 @@
//
import UIKit
import DTTextField
class ViewController: UIViewController {
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2020 Dhaval Thanki
Copyright (c) 2022 Dhaval Thanki
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+12 -1
View File
@@ -1,6 +1,6 @@
# DTTextField
[![Version](https://img.shields.io/badge/Pod-V0.4.0-green.svg)](https://github.com/iDhaval/DTTextField/releases/tag/0.2.4)
[![Version](https://img.shields.io/badge/Pod-V0.7.0-green.svg)](https://github.com/iDhaval/DTTextField/releases/tag/0.7.0)
[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/iDhaval/DTTextField/blob/master/LICENSE)
[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/matteocrippa/awesome-swift)
[![Platform](https://img.shields.io/badge/Language-Swift_5.0-orange.svg)](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/)
@@ -25,6 +25,8 @@ Clone the repo and run the example project from the Example directory.
## Installation
### CocoaPods
DTTextField is available through [CocoaPods](http://cocoapods.org). To install
it, simply add the following line to your Podfile:
@@ -32,6 +34,14 @@ it, simply add the following line to your Podfile:
pod 'DTTextField'
```
### Swift Package Manager
Click `File` -> `Add Packages...`, enter [DTTextField repo's URL](https://github.com/iDhaval/DTTextField).
```swift
https://github.com/iDhaval/DTTextField
```
## Usage
1. Open a storyboard or Xib file.
@@ -44,6 +54,7 @@ pod 'DTTextField'
| ------------- |------------- | ----- |
| errorMessage | String | Add your error message to this property|
| errorFont | UIFont | Change font of error text |
| errorTextColor | UIColor | Change color of error text |
| paddingYErrorLabel | CGFloat | Error text top padding |
| floatPlaceholderColor | UIColor | To change float placeholder color |
| floatPlaceholderActiveColor | UIColor | To change float placeholder color while TextField is active(First responder)|
+7 -1
View File
@@ -100,6 +100,12 @@ public class DTTextField: UITextField {
}
}
public var errorTextColor = UIColor.red {
didSet{
lblError.textColor = errorTextColor
}
}
public var floatPlaceholderFont = UIFont.systemFont(ofSize: 10.0){
didSet{
lblFloatPlaceholder.font = floatPlaceholderFont
@@ -266,7 +272,7 @@ public class DTTextField: UITextField {
lblError.frame = CGRect.zero
lblError.font = errorFont
lblError.textColor = UIColor.red
lblError.textColor = errorTextColor
lblError.numberOfLines = 0
lblError.isHidden = true