- New Project in XCode ( i have version 4.3.3 )
- In Architectures from project options set the fallowing: $(ARCHS_STANDARD_32_BIT) armv6
- on the valid architectures set "armv6 armv7 i386" values
- on the Build Phases tab, add the Run Script code:
# Version 2.0 (updated for Xcode 4, with some fixes) # Changes: # - Works with xcode 4, even when running xcode 3 projects (Workarounds for apple bugs) # - Faster / better: only runs lipo once, instead of once per recursion # - Added some debugging statemetns that can be switched on/off by changing the DEBUG_THIS_SCRIPT variable to "true" # - Fixed some typos # # Purpose: # Create a static library for iPhone from within XCode # Because Apple staff DELIBERATELY broke Xcode to make this impossible from the GUI (Xcode 3.2.3 specifically states this in the Release notes!) # ...no, I don't understand why they did this! # # Author: Adam Martin - http://twitter.com/redglassesapps # Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER) # # More info: see this Stack Overflow question: http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4 #################[ Tests: helps workaround any future bugs in Xcode ]######## # DEBUG_THIS_SCRIPT="false" if [ $DEBUG_THIS_SCRIPT = "true" ] then echo "########### TESTS #############" echo "Use the following variables when debugging this script; note that they may change on recursions" echo "BUILD_DIR = $BUILD_DIR" echo "BUILD_ROOT = $BUILD_ROOT" echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR" echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR" echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR" echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR" fi #####################[ part 1 ]################## # First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it) # (incidental: searching for substrings in sh is a nightmare! Sob) SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$') # Next, work out if we're in SIM or DEVICE if [ ${PLATFORM_NAME} = "iphonesimulator" ] then OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION} else OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION} fi echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})" echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}" # #####################[ end of part 1 ]################## #####################[ part 2 ]################## # # IF this is the original invocation, invoke WHATEVER other builds are required # # Xcode is already building ONE target... # # ...but this is a LIBRARY, so Apple is wrong to set it to build just one. # ...we need to build ALL targets # ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!) # # # So: build ONLY the missing platforms/configurations. if [ "true" == ${ALREADYINVOKED:-false} ] then echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse" else # CRITICAL: # Prevent infinite recursion (Xcode sucks) export ALREADYINVOKED="true" echo "RECURSION: I am the root ... recursing all missing build targets NOW..." echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" xcodebuild -configuration "${CONFIGURATION}" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" ACTION="build" #Merge all platform binaries as a fat binary for each configurations. # Calculate where the (multiple) built files are coming from: CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}" echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}" CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}" # ... remove the products of previous runs of this script # NB: this directory is ONLY created by this script - it should be safe to delete! rm -rf "${CREATING_UNIVERSAL_DIR}" mkdir "${CREATING_UNIVERSAL_DIR}" # echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}" ######### # # Added: StackOverflow suggestion to also copy "include" files # (untested, but should work OK) # if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ] then mkdir -p "${CREATING_UNIVERSAL_DIR}/usr/local/include" # * needs to be outside the double quotes? cp "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include/"* "${CREATING_UNIVERSAL_DIR}/usr/local/include" fi fi
5. Generate for IPhone Simulator
6. Use the a file generated in ../Debug-Universal.
Dantes personal blog
joi, 21 iunie 2012
How to make a fat library for MonoTouch in XCode
duminică, 5 februarie 2012
iCarousel monotouch binding code
Objective-c header file:
C# ApiDefinition.cs file:
#ifndef AH_RETAIN #if __has_feature(objc_arc) #define AH_RETAIN(x) x #define AH_RELEASE(x) #define AH_AUTORELEASE(x) x #define AH_SUPER_DEALLOC #else #define __AH_WEAK #define AH_WEAK assign #define AH_RETAIN(x) [x retain] #define AH_RELEASE(x) [x release] #define AH_AUTORELEASE(x) [x autorelease] #define AH_SUPER_DEALLOC [super dealloc] #endif #endif // Weak reference support #ifndef AH_WEAK #if defined __IPHONE_OS_VERSION_MIN_REQUIRED #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 #define __AH_WEAK __weak #define AH_WEAK weak #else #define __AH_WEAK __unsafe_unretained #define AH_WEAK unsafe_unretained #endif #elif defined __MAC_OS_X_VERSION_MIN_REQUIRED #if __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6 #define __AH_WEAK __weak #define AH_WEAK weak #else #define __AH_WEAK __unsafe_unretained #define AH_WEAK unsafe_unretained #endif #endif #endif // ARC Helper ends #ifdef USING_CHAMELEON #define ICAROUSEL_IOS #elif defined __IPHONE_OS_VERSION_MAX_ALLOWED #define ICAROUSEL_IOS typedef CGRect NSRect; typedef CGSize NSSize; #else #define ICAROUSEL_MACOS #endif #import#ifdef ICAROUSEL_IOS #import #else #import typedef NSView UIView; #endif typedef enum { iCarouselTypeLinear = 0, iCarouselTypeRotary, iCarouselTypeInvertedRotary, iCarouselTypeCylinder, iCarouselTypeInvertedCylinder, iCarouselTypeWheel, iCarouselTypeInvertedWheel, iCarouselTypeCoverFlow, iCarouselTypeCoverFlow2, iCarouselTypeTimeMachine, iCarouselTypeInvertedTimeMachine, iCarouselTypeCustom } iCarouselType; typedef enum { iCarouselTranformOptionCount = 0, iCarouselTranformOptionArc, iCarouselTranformOptionAngle, iCarouselTranformOptionRadius, iCarouselTranformOptionTilt, iCarouselTranformOptionSpacing } iCarouselTranformOption; @protocol iCarouselDataSource, iCarouselDelegate; @interface iCarousel : UIView //required for 32-bit Macs #ifdef __i386__ { @private id __AH_WEAK delegate; id __AH_WEAK dataSource; iCarouselType type; CGFloat perspective; NSInteger numberOfItems; NSInteger numberOfPlaceholders; NSInteger numberOfPlaceholdersToShow; NSInteger numberOfVisibleItems; UIView *contentView; NSDictionary *itemViews; NSMutableSet *itemViewPool; NSMutableSet *placeholderViewPool; NSInteger previousItemIndex; CGFloat itemWidth; CGFloat scrollOffset; CGFloat offsetMultiplier; CGFloat startVelocity; id __unsafe_unretained timer; BOOL decelerating; BOOL scrollEnabled; CGFloat decelerationRate; BOOL bounces; CGSize contentOffset; CGSize viewpointOffset; CGFloat startOffset; CGFloat endOffset; NSTimeInterval scrollDuration; NSTimeInterval startTime; BOOL scrolling; CGFloat previousTranslation; BOOL centerItemWhenSelected; BOOL shouldWrap; BOOL dragging; BOOL didDrag; CGFloat scrollSpeed; CGFloat bounceDistance; NSTimeInterval toggleTime; CGFloat toggle; BOOL stopAtItemBoundary; BOOL scrollToItemBoundary; BOOL useDisplayLink; BOOL vertical; BOOL ignorePerpendicularSwipes; } #endif @property (nonatomic, AH_WEAK) IBOutlet id dataSource; @property (nonatomic, AH_WEAK) IBOutlet id delegate; @property (nonatomic, assign) iCarouselType type; @property (nonatomic, assign) CGFloat perspective; @property (nonatomic, assign) CGFloat decelerationRate; @property (nonatomic, assign) CGFloat scrollSpeed; @property (nonatomic, assign) CGFloat bounceDistance; @property (nonatomic, assign) BOOL scrollEnabled; @property (nonatomic, assign) BOOL bounces; @property (nonatomic, readonly) CGFloat scrollOffset; @property (nonatomic, readonly) CGFloat offsetMultiplier; @property (nonatomic, assign) CGSize contentOffset; @property (nonatomic, assign) CGSize viewpointOffset; @property (nonatomic, readonly) NSInteger numberOfItems; @property (nonatomic, readonly) NSInteger numberOfPlaceholders; @property (nonatomic, readonly) NSInteger currentItemIndex; @property (nonatomic, strong, readonly) UIView *currentItemView; @property (nonatomic, strong, readonly) NSArray *indexesForVisibleItems; @property (nonatomic, readonly) NSInteger numberOfVisibleItems; @property (nonatomic, strong, readonly) NSArray *visibleItemViews; @property (nonatomic, readonly) CGFloat itemWidth; @property (nonatomic, strong, readonly) UIView *contentView; @property (nonatomic, readonly) CGFloat toggle; @property (nonatomic, assign) BOOL stopAtItemBoundary; @property (nonatomic, assign) BOOL scrollToItemBoundary; @property (nonatomic, assign) BOOL useDisplayLink; @property (nonatomic, assign, getter = isVertical) BOOL vertical; @property (nonatomic, assign) BOOL ignorePerpendicularSwipes; - (void)scrollByNumberOfItems:(NSInteger)itemCount duration:(NSTimeInterval)duration; - (void)scrollToItemAtIndex:(NSInteger)index duration:(NSTimeInterval)duration; - (void)scrollToItemAtIndex:(NSInteger)index animated:(BOOL)animated; - (void)removeItemAtIndex:(NSInteger)index animated:(BOOL)animated; - (void)insertItemAtIndex:(NSInteger)index animated:(BOOL)animated; - (void)reloadItemAtIndex:(NSInteger)index animated:(BOOL)animated; - (UIView *)itemViewAtIndex:(NSInteger)index; - (NSInteger)indexOfItemView:(UIView *)view; - (NSInteger)indexOfItemViewOrSubview:(UIView *)view; - (void)reloadData; #ifdef ICAROUSEL_IOS @property (nonatomic, assign) BOOL centerItemWhenSelected; #endif @end @protocol iCarouselDataSource - (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel; - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view; @optional - (NSUInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel; - (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index reusingView:(UIView *)view; - (NSUInteger)numberOfVisibleItemsInCarousel:(iCarousel *)carousel; //deprecated, use carousel:viewForItemAtIndex:reusingView: and carousel:placeholderViewAtIndex:reusingView: instead - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index __deprecated; - (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index __deprecated; @end @protocol iCarouselDelegate @optional - (void)carouselWillBeginScrollingAnimation:(iCarousel *)carousel; - (void)carouselDidEndScrollingAnimation:(iCarousel *)carousel; - (void)carouselDidScroll:(iCarousel *)carousel; - (void)carouselCurrentItemIndexUpdated:(iCarousel *)carousel; - (void)carouselWillBeginDragging:(iCarousel *)carousel; - (void)carouselDidEndDragging:(iCarousel *)carousel willDecelerate:(BOOL)decelerate; - (void)carouselWillBeginDecelerating:(iCarousel *)carousel; - (void)carouselDidEndDecelerating:(iCarousel *)carousel; - (CGFloat)carouselItemWidth:(iCarousel *)carousel; - (CGFloat)carouselOffsetMultiplier:(iCarousel *)carousel; - (BOOL)carouselShouldWrap:(iCarousel *)carousel; - (CGFloat)carousel:(iCarousel *)carousel itemAlphaForOffset:(CGFloat)offset; - (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform; - (CGFloat)carousel:(iCarousel *)carousel valueForTransformOption:(iCarouselTranformOption)option withDefault:(CGFloat)value; //deprecated, use transformForItemAtIndex:withOffset:baseTransform: instead - (CATransform3D)carousel:(iCarousel *)carousel transformForItemView:(UIView *)view withOffset:(CGFloat)offset __deprecated; #ifdef ICAROUSEL_IOS - (BOOL)carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index; - (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index; #endif @end
C# ApiDefinition.cs file:
using System; using System.Drawing; using MonoTouch.Foundation; using MonoTouch.ObjCRuntime; using MonoTouch.UIKit; using MonoTouch.CoreGraphics; using System.Collections.Generic; using MonoTouch.CoreAnimation; namespace iCarouselSharp { [BaseType (typeof (UIView))] interface iCarousel { [Export ("initWithFrame:")] IntPtr Constructor (RectangleF frame); //@property (nonatomic, AH_WEAK) IBOutlet iddataSource; [Export ("dataSource")] iCarouselDataSource DataSource { get; set; } //@property (nonatomic, AH_WEAK) IBOutlet id delegate; [Wrap ("WeakDelegate")] iCarouselDelegate Delegate { get; set; } //@property (nonatomic, AH_WEAK) IBOutlet id delegate; [Export ("delegate", ArgumentSemantic.Assign), NullAllowed] NSObject WeakDelegate { get; set; } //@property (nonatomic, assign) iCarouselType type; [Export ("type")] iCarouselType Type{ get; set; } /*@property (nonatomic, assign) CGFloat perspective;*/ [Export ("perspective")] float Perspective{ get; set; } /*@property (nonatomic, assign) CGFloat decelerationRate;*/ [Export ("decelerationRate")] float DecelerationRate{ get; set; } /*@property (nonatomic, assign) CGFloat scrollSpeed;*/ [Export ("scrollSpeed")] float ScrollSpeed{ get; set; } /*@property (nonatomic, assign) CGFloat bounceDistance;*/ [Export ("bounceDistance")] float BounceDistance{ get; set; } /*@property (nonatomic, assign) BOOL scrollEnabled;*/ [Export ("scrollEnabled")] bool ScrollEnabled{ get; set; } /*@property (nonatomic, assign) BOOL bounces;*/ [Export ("bounces")] bool Bounces{ get; set; } /*@property (nonatomic, readonly) CGFloat scrollOffset;*/ [Export ("scrollOffset")] float ScrollOffset{ get; } /*@property (nonatomic, readonly) CGFloat offsetMultiplier;*/ [Export ("offsetMultiplier")] float OffsetMultiplier{ get; } /*@property (nonatomic, assign) CGSize contentOffset;*/ [Export ("contentOffset")] SizeF ContentOffset{ get; } /*@property (nonatomic, assign) CGSize viewpointOffset;*/ [Export ("viewpointOffset")] SizeF ViewpointOffset{ get; set; } /*@property (nonatomic, readonly) NSInteger numberOfItems;*/ [Export ("numberOfItems")] int NumberOfItems{ get; } // @property (nonatomic, readonly) NSInteger numberOfPlaceholders; [Export ("numberOfPlaceholders")] int NumberOfPlaceholders{ get; } // @property (nonatomic, readonly) NSInteger currentItemIndex; //! [Export ("currentItemIndex")] int CurrentItemIndex{ get; } // @property (nonatomic, strong, readonly) UIView *currentItemView; //! [Export ("currentItemView")] int CurrentItemView{ get; } // @property (nonatomic, strong, readonly) NSArray *indexesForVisibleItems; //! [Export ("indexesForVisibleItems")] NSArray IndexesForVisibleItems{ get; } // @property (nonatomic, readonly) NSInteger numberOfVisibleItems; [Export ("numberOfVisibleItems")] int NumberOfVisibleItems{ get; } // @property (nonatomic, strong, readonly) NSArray *visibleItemViews; //! [Export ("visibleItemViews")] UIView[] VisibleItemViews{ get; } // @property (nonatomic, readonly) CGFloat itemWidth; [Export ("itemWidth")] float ItemWidth{ get; } // @property (nonatomic, strong, readonly) UIView *contentView; [Export ("contentView")] UIView VontentView{ get; } // @property (nonatomic, readonly) CGFloat toggle; [Export ("toggle")] float Toggle{ get; } // @property (nonatomic, assign) BOOL stopAtItemBoundary; [Export ("stopAtItemBoundary")] bool StopAtItemBoundary{ get; set; } // @property (nonatomic, assign) BOOL scrollToItemBoundary; [Export ("scrollToItemBoundary")] bool ScrollToItemBoundary{ get; set; } // @property (nonatomic, assign) BOOL useDisplayLink; [Export ("useDisplayLink")] bool UseDisplayLink{ get; set; } // @property (nonatomic, assign, getter = isVertical) BOOL vertical; [Export ("vertical")] bool Vertical{ [Bind ("isVertical")]get; set; } // @property (nonatomic, assign) BOOL ignorePerpendicularSwipes; [Export ("ignorePerpendicularSwipes")] bool IgnorePerpendicularSwipes{ get; set; } // @property (nonatomic, assign) BOOL centerItemWhenSelected; [Export ("centerItemWhenSelected")] bool CenterItemWhenSelected{ get; set; } // - (void)scrollByNumberOfItems:(NSInteger)itemCount duration:(NSTimeInterval)duration; [Export ("scrollByNumberOfItems:itemCount:duration:")] void scrollByNumberOfItems( int itemCount, double duration ); // - (void)scrollToItemAtIndex:(NSInteger)index duration:(NSTimeInterval)duration; [Export ("scrollToItemAtIndex:index:duration:")] void scrollToItemAtIndex( int index, double duration ); // - (void)scrollToItemAtIndex:(NSInteger)index animated:(BOOL)animated; [Export ("scrollToItemAtIndex:index:animated:")] void scrollToItemAtIndex( int index, bool animated ); // - (void)removeItemAtIndex:(NSInteger)index animated:(BOOL)animated; [Export ("removeItemAtIndex:index:animated:")] void removeItemAtIndex( int index, bool animated ); // - (void)insertItemAtIndex:(NSInteger)index animated:(BOOL)animated; [Export ("insertItemAtIndex:index:animated:")] void insertItemAtIndex( int index, bool animated ); // - (void)reloadItemAtIndex:(NSInteger)index animated:(BOOL)animated; [Export ("reloadItemAtIndex:index:animated:")] void reloadItemAtIndex( int index, bool animated ); // - (UIView *)itemViewAtIndex:(NSInteger)index; [Export ("itemViewAtIndex:")] UIView itemViewAtIndex( int index ); // - (NSInteger)indexOfItemView:(UIView *)view; [Export ("indexOfItemView:")] int indexOfItemView( UIView view ); // - (NSInteger)indexOfItemViewOrSubview:(UIView *)view; [Export ("indexOfItemViewOrSubview:")] int indexOfItemViewOrSubview( UIView view ); // - (void)reloadData; [Export ("reloadData")] void reloadData(); } [BaseType (typeof (NSObject))] [Model] interface iCarouselDataSource { // - (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel; [Export ("numberOfItemsInCarousel:")] int numberOfItemsInCarousel( iCarousel carousel ); // - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view; [Export ("carousel:viewForItemAtIndex:reusingView:")] UIView viewForItemAtIndex( iCarousel carousel, int index, UIView view ); // @optional // // - (NSUInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel; // - (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index reusingView:(UIView *)view; //- (NSUInteger)numberOfVisibleItemsInCarousel:(iCarousel *)carousel; [Export ("numberOfVisibleItemsInCarousel:")] int numberOfVisibleItemsInCarousel( iCarousel carousel ); // // //deprecated, use carousel:viewForItemAtIndex:reusingView: and carousel:placeholderViewAtIndex:reusingView: instead // - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index __deprecated; // - (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index __deprecated; } [BaseType (typeof (NSObject))] [Model] interface iCarouselDelegate { // - (void)carouselWillBeginScrollingAnimation:(iCarousel *)carousel; [Export ("carouselWillBeginScrollingAnimation:")] void WillBeginScrollingAnimation( iCarousel carousel ); // - (void)carouselDidEndScrollingAnimation:(iCarousel *)carousel; [Export ("carouselDidEndScrollingAnimation:")] void DidEndScrollingAnimation( iCarousel carousel ); // - (void)carouselDidScroll:(iCarousel *)carousel; [Export ("carouselDidScroll:")] void DidScroll( iCarousel carousel ); // - (void)carouselCurrentItemIndexUpdated:(iCarousel *)carousel; [Export ("carouselCurrentItemIndexUpdated:")] void CurrentItemIndexUpdated( iCarousel carousel ); // - (void)carouselWillBeginDragging:(iCarousel *)carousel; [Export ("carouselWillBeginDragging:")] void WillBeginDragging( iCarousel carousel ); // - (void)carouselDidEndDragging:(iCarousel *)carousel willDecelerate:(BOOL)decelerate; [Export ("carouselDidEndDragging:")] void DidEndDragging( iCarousel carousel ); // - (void)carouselWillBeginDecelerating:(iCarousel *)carousel; [Export ("carouselWillBeginDecelerating:")] void WillBeginDecelerating( iCarousel carousel ); // - (void)carouselDidEndDecelerating:(iCarousel *)carousel; [Export ("carouselDidEndDecelerating:")] void DidEndDecelerating( iCarousel carousel ); // - (CGFloat)carouselItemWidth:(iCarousel *)carousel; [Export ("carouselItemWidth:")] float ItemWidth( iCarousel carousel ); // - (CGFloat)carouselOffsetMultiplier:(iCarousel *)carousel; [Export ("carouselOffsetMultiplier:")] float OffsetMultiplier( iCarousel carousel ); // - (BOOL)carouselShouldWrap:(iCarousel *)carousel; [Export ("carouselShouldWrap:")] bool ShouldWrap( iCarousel carousel ); // - (CGFloat)carousel:(iCarousel *)carousel itemAlphaForOffset:(CGFloat)offset; [Export ("carousel:itemAlphaForOffset:")] float itemAlphaForOffset( iCarousel carousel, float offset ); // - (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform; [Export ("carousel:itemTransformForOffset:baseTransform:")] CATransform3D carousel( iCarousel carousel, float offset, CATransform3D transform ); // - (CGFloat)carousel:(iCarousel *)carousel valueForTransformOption:(iCarouselTranformOption)option withDefault:(CGFloat)value; [Export ("carousel:valueForTransformOption:withDefault:")] float valueForTransformOption( iCarousel carousel, iCarouselTranformOption option, float withDefault ); // - (BOOL)carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index; [Export ("carousel:shouldSelectItemAtIndex:")] bool shouldSelectItemAtIndex( iCarousel carousel, int index ); // - (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index; [Export ("carousel:didSelectItemAtIndex:")] void didSelectItemAtIndex( iCarousel carousel, int index ); } }
sâmbătă, 28 ianuarie 2012
How to use a objective-c library in monotouch
There are many nice objective-c libraries out there, and it you would loose precious time to port them in c#/monotouch. But, with the new LinkWith attribute and the latest Monodevelop & Monotouch you can use a native library very easy.
I took for an example the iCarousel library from here wich is a great image gallery widget.
- download the objective-c source code of iCarousel
- create a new project in Xcode ( i have Xcode 4.2 ), and call it for example "iCarousel". Choose the Cocoa Touch Static Library project type, like this:
I took for an example the iCarousel library from here wich is a great image gallery widget.
Ok, so these are the steps required:
- download the objective-c source code of iCarousel
- create a new project in Xcode ( i have Xcode 4.2 ), and call it for example "iCarousel". Choose the Cocoa Touch Static Library project type, like this:
replace the iCarousel.h and iCarousel.m files with the files from the downloaded source code.
Go to project settings.
In the "Build Settings" page, add the "i386" and "armv6" value to Architectures ( it must like like this:
"armv6 $(ARCHS_STANDARD_32_BIT)" )
Into the Link Binary With Libraries add:
After you make the binding interface, build your project, and the fresh new generated dll file in your projects :)
"armv6 $(ARCHS_STANDARD_32_BIT)" )
Also change the "Valid Architectures" to i386 armv6 armv7.
Be sure to also change the "iOs deployment target" to the desired version.
Go to the "Build Phases" and add "-fno-objc-arc" as a value to all header files just under the "Compiler flags" ( apple select all them and press enter ).Into the Link Binary With Libraries add:
- CoreGraphics
- UIKit
- QuartzCore
You're almost done now. You need to only add a small script to compile for simulator also.
Insert in RunScript the fallowing script like in this screenshot:
Okay. Now you're ready to make the bindings :) Just Clean & Build your project, and add the generated library file ( Attention! libiCarousel.a is in the in a folder Debug_universal or Release_universal) to your binding project in monotouch. Be sure to make the LinkWith attribute look like this:
Insert in RunScript the fallowing script like in this screenshot:
# Version 2.0 (updated for Xcode 4, with some fixes) # Changes: # - Works with xcode 4, even when running xcode 3 projects (Workarounds for apple bugs) # - Faster / better: only runs lipo once, instead of once per recursion # - Added some debugging statemetns that can be switched on/off by changing the DEBUG_THIS_SCRIPT variable to "true" # - Fixed some typos # # Purpose: # Create a static library for iPhone from within XCode # Because Apple staff DELIBERATELY broke Xcode to make this impossible from the GUI (Xcode 3.2.3 specifically states this in the Release notes!) # ...no, I don't understand why they did this! # # Author: Adam Martin - http://twitter.com/redglassesapps # Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER) # # More info: see this Stack Overflow question: http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4 #################[ Tests: helps workaround any future bugs in Xcode ]######## # DEBUG_THIS_SCRIPT="false" if [ $DEBUG_THIS_SCRIPT = "true" ] then echo "########### TESTS #############" echo "Use the following variables when debugging this script; note that they may change on recursions" echo "BUILD_DIR = $BUILD_DIR" echo "BUILD_ROOT = $BUILD_ROOT" echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR" echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR" echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR" echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR" fi #####################[ part 1 ]################## # First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it) # (incidental: searching for substrings in sh is a nightmare! Sob) SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$') # Next, work out if we're in SIM or DEVICE if [ ${PLATFORM_NAME} = "iphonesimulator" ] then OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION} else OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION} fi echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})" echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}" # #####################[ end of part 1 ]################## #####################[ part 2 ]################## # # IF this is the original invocation, invoke WHATEVER other builds are required # # Xcode is already building ONE target... # # ...but this is a LIBRARY, so Apple is wrong to set it to build just one. # ...we need to build ALL targets # ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!) # # # So: build ONLY the missing platforms/configurations. if [ "true" == ${ALREADYINVOKED:-false} ] then echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse" else # CRITICAL: # Prevent infinite recursion (Xcode sucks) export ALREADYINVOKED="true" echo "RECURSION: I am the root ... recursing all missing build targets NOW..." echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" xcodebuild -configuration "${CONFIGURATION}" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" ACTION="build" #Merge all platform binaries as a fat binary for each configurations. # Calculate where the (multiple) built files are coming from: CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}" echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}" CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}" # ... remove the products of previous runs of this script # NB: this directory is ONLY created by this script - it should be safe to delete! rm -rf "${CREATING_UNIVERSAL_DIR}" mkdir "${CREATING_UNIVERSAL_DIR}" # echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}" ######### # # Added: StackOverflow suggestion to also copy "include" files # (untested, but should work OK) # if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ] then mkdir -p "${CREATING_UNIVERSAL_DIR}/usr/local/include" # * needs to be outside the double quotes? cp "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include/"* "${CREATING_UNIVERSAL_DIR}/usr/local/include" fi fi
Okay. Now you're ready to make the bindings :) Just Clean & Build your project, and add the generated library file ( Attention! libiCarousel.a is in the in a folder Debug_universal or Release_universal) to your binding project in monotouch. Be sure to make the LinkWith attribute look like this:
[assembly: LinkWith ("libiCarousel.a", LinkTarget.ArmV6 | LinkTarget.ArmV7 | LinkTarget.Simulator, ForceLoad = true, Frameworks="CoreGraphics QuartzCore UIKit")]
To make the bindings easier I'm using this little script based on the MonoMac parser class, that takes an objective-c header file and generate a c# binding interface for it. It's not perfect, but it help's a lot.
After you make the binding interface, build your project, and the fresh new generated dll file in your projects :)
Happy coding!
Etichete:
binding,
C sharp,
C#,
LinkWith attribute,
MonoTouch,
native library,
objective-c
joi, 19 ianuarie 2012
Tapjoy publisher library for MonoTouch
Hello there monotouch users,
Tapjoy is a wonderful platform, but unfortunately they have not developed a library for monotouch users. And since C # is 10 times more beautiful and better for RAD than Objective-C, I decided to make it myself.
Basically I took the publishers library for XNA, and I adapted it for monotouch.
Tapjoy is a wonderful platform, but unfortunately they have not developed a library for monotouch users. And since C # is 10 times more beautiful and better for RAD than Objective-C, I decided to make it myself.
Basically I took the publishers library for XNA, and I adapted it for monotouch.
I hope this is helpful!
Download sources here.
Sample:
Download sources here.
Sample:
TapjoyConnect.Instance.TapjoyConnectCompleted += delegate(object sender, TapjoyConnectCompletedEventArgs e) { if( e.Succeeded ) Console.WriteLine("tapjoy succeeded!"); else Console.WriteLine("error; check your app id or secret key"); }; TapjoyConnect.Instance.RequestTapjoyConnect( APP_ID , SECRET_KEY );
vineri, 13 ianuarie 2012
How to compile Sparrow for Monotouch
Download the bindings from
https://github.com/trustme/Sparrow
and inside the folder with the bindings run these commands:
- /Developer/MonoTouch/usr/bin/btouch sparrow.cs -s:enum.cs --outdir=gen -ns=Sparrow --unsafe --sourceonly=genfiles
- /Developer/MonoTouch/usr/bin/smcs -out:sparrow.dll `cat genfiles` extensions.cs -unsafe -r:/Developer/MonoTouch/usr/lib/mono/2.1/monotouch.dll enum.cs -target:library
marți, 2 august 2011
A MonoTouch class for resize maintaining aspect ratio or crop your images
Hy guys,
I wrote a c# class for a personal project, and I'm sure it will be useful for you to. Very often we need to quickly resize an UIImage, using Thumb Resize maintaining aspect ratio or Crop Resize...
A quick example to crop and resize an image from 768x507 to 300x300:
Or resize maintaining ratio to a maximum of 200x200:
Also you can scale it to 120% for example
So, here it is!
I wrote a c# class for a personal project, and I'm sure it will be useful for you to. Very often we need to quickly resize an UIImage, using Thumb Resize maintaining aspect ratio or Crop Resize...
A quick example to crop and resize an image from 768x507 to 300x300:
//load a test image, with size: 768x507 UIImage img = UIImage.FromFile("test.jpg"); //initiate the resizer class ImageResizer resizer = new ImageResizer(img); //crop resize resizer.CropResize( 300,300 ); //and that's it! The image is resized & croped to exactly 300x300 UIImage croppedImage = resizer.ModifiedImage;
Or resize maintaining ratio to a maximum of 200x200:
//load a test image, with size: 768x507 UIImage img = UIImage.FromFile("test.jpg"); //initiate the resizer class ImageResizer resizer = new ImageResizer(img); //crop resize resizer.RatioResize( 200,200 ); //now it has 200x132 //and that's it! UIImage croppedImage = resizer.ModifiedImage;
Also you can scale it to 120% for example
//load a test image, with size: 768x507 UIImage img = UIImage.FromFile("test.jpg"); //initiate the resizer class ImageResizer resizer = new ImageResizer(img); //crop resize resizer.Scale( 120 ); //now it has 922x608 //and that's it! UIImage croppedImage = resizer.ModifiedImage;
So, here it is!
using System; using MonoTouch.UIKit; using System.Drawing; using MonoTouch.CoreGraphics; namespace Test { public enum CropPosition { Start, Center, End } public class ImageResizer { UIImage initialImage = null; UIImage modifiedImage = null; public ImageResizer ( UIImage image ) { this.initialImage = image; this.modifiedImage = image; } /// <summary> /// strech resize /// </summary> public void Resize( float width, float height ) { UIGraphics.BeginImageContext( new SizeF( width, height ) ); // modifiedImage.Draw( new RectangleF( 0,0, width, height ) ); modifiedImage = UIGraphics.GetImageFromCurrentImageContext(); // UIGraphics.EndImageContext(); } public void RatioResizeToWidth( float width ) { Console.WriteLine("resize to width: " + width ); var cur_width = modifiedImage.Size.Width; if( cur_width > width ) { var ratio = width / cur_width; var height = modifiedImage.Size.Height * ratio; //resize Resize( width, height ); } } public void RatioResizeToHeight( float height ) { Console.WriteLine("resize to height: " + height ); var cur_height = modifiedImage.Size.Height; if( cur_height > height ) { var ratio = height / cur_height; var width = modifiedImage.Size.Width * ratio; // Resize( width, height ); } } /// <summary> /// resize maintaining ratio /// </summary> public void RatioResize( float max_width, float max_height ) { if( max_width > max_height ) { RatioResizeToWidth ( max_width ); RatioResizeToHeight( max_height ); } else { RatioResizeToHeight( max_height ); RatioResizeToWidth ( max_width ); } } /// <summary> /// scaling the image with a given procent value /// </summary> public void Scale( float procent ) { var width = modifiedImage.Size.Width * (procent / 100); var height = modifiedImage.Size.Height * (procent / 100); Resize( width, height ); } /// <summary> /// default crop resize, set on center /// </summary> public void CropResize( float width, float height ) { CropResize(width, height, CropPosition.Center ); } /// <summary> /// resize and crop to a specific location /// </summary> public void CropResize( float width, float height, CropPosition position ) { SizeF ImgSize = modifiedImage.Size; // if( ImgSize.Width < width ) width = ImgSize.Width; if( ImgSize.Height < height ) height = ImgSize.Height; // float crop_x = 0; float crop_y = 0; if( ImgSize.Width / width < ImgSize.Height / height ) { //scad din width RatioResizeToWidth( width ); ImgSize = modifiedImage.Size; //compute crop_y if( position == CropPosition.Center ) crop_y = (ImgSize.Height / 2) - (height / 2); if( position == CropPosition.End ) crop_y = ImgSize.Height - height; } else { //change height RatioResizeToHeight( height ); ImgSize = modifiedImage.Size; //calculeaza crop_x if( position == CropPosition.Center ) crop_x = (ImgSize.Width / 2) - (width / 2); if( position == CropPosition.End ) crop_x = ImgSize.Width - width; } //create new contect UIGraphics.BeginImageContext( new SizeF( width, height ) ); CGContext context = UIGraphics.GetCurrentContext(); //crops the new context to the desired height and width RectangleF clippedRect = new RectangleF( 0, 0, width, height ); context.ClipToRect(clippedRect); //draw my image on the context RectangleF drawRect = new RectangleF( -crop_x, -crop_y, ImgSize.Width, ImgSize.Height ); modifiedImage.Draw( drawRect ); //save the context in modifiedImage modifiedImage = UIGraphics.GetImageFromCurrentImageContext(); //close the context UIGraphics.EndImageContext(); } public UIImage InitialImage { get { return this.initialImage; } } public UIImage ModifiedImage { get { return this.modifiedImage; } } } }
marți, 5 iulie 2011
A corona lua multi-touch pinch-zoom example
I found that the pinch zoom example in here was a little harder to understand, so I decided to make my own class to handle pinch-zoom events:
It's simple to use, just do something like:
--hide the statusbar display.setStatusBar( display.HiddenStatusBar ) --include the mtouch library local mtouch = require( "mtouch" ) --create the zoom object - an image local image = nil local function OnZoomIn( event ) --grow our image image.xScale = image.xScale * 1.01 image.yScale = image.yScale * 1.01 print("new width="..image.contentWidth) end local function OnZoomOut( event ) --shrink our image image.xScale = image.xScale / 1.01 image.yScale = image.yScale / 1.01 print("new width="..image.contentWidth) end local function main() --add the image image = display.newImage("image.jpg" ) --set the imaage to the center of the device image.x = display.contentWidth * 0.5 image.y = display.contentHeight * 0.5 --create the pinch zoom over our image mtouch.setZoomObject( image ) mtouch.setOnZoomIn ( OnZoomIn ) mtouch.setOnZoomOut ( OnZoomOut ) --add the fictive touch for the simulator - comment this if you are deploying to device! mtouch.setFictiveSimulatorTouch( 100, 100 ) end main()
Screenshot:
And the mtouch class:
module(..., package.seeall) -- activate multitouch system.activate( "multitouch" ) -- math helpers local sqrt = math.sqrt local abs = math.abs -- current touches local touches = {} -- last zoom distance - I use this to compare with current distance -- if its smaller then zoom out, else zoom in local lastDistance = 0 local zoomObject = nil --the zoom object local OnZoomIn = nil --the zoom in event local OnZoomOut = nil --the zoom out event --fictive touch local fictiveTouch = {} fictiveTouch.id = "QHHJGL10" ----------------------------------------------- -- counts a dictionary ----------------------------------------------- local function CountDictionary(dict) local ret = 0 for k, v in pairs(dict) do ret = ret + 1 end return ret end ----------------------------------------------- -- returns an element at some index in a dictionary ----------------------------------------------- local function GetDictElAtIndex( dict, index ) local temp = 0 local ret = nil for k, v in pairs(dict) do if( temp == index ) then ret = v break end temp = temp + 1 end return ret end ----------------------------------------------- -- update x and y for a specific touch-event ----------------------------------------------- local function UpdateTouch( event ) local id = event.id local obj = event.target local x = event.x local y = event.y if touches[id] then touches[id].x = x touches[id].y = y end end ----------------------------------------------- -- calculate the distance between two touches ----------------------------------------------- local function DistanceBetween2T( t1, t2 ) local ret = 0 local deltax = t2.x - t1.x local deltay = t2.y - t1.y ret = sqrt( deltax * deltax + deltay * deltay ) return ret end ----------------------------------------------- -- touch listener ----------------------------------------------- function on_touch( event ) local ret = false if event.phase == "began" then --register this touch touches[ event.id ] = event elseif event.phase == "moved" then UpdateTouch(event) --verify if i have at least 2 touches if( CountDictionary(touches) >= 2 ) then zoomObject.touching = true --gets the first 2 touches and calculate the distance between them local touch1 = GetDictElAtIndex( touches, 0 ) local touch2 = GetDictElAtIndex( touches, 1 ) local dist = DistanceBetween2T( touch1, touch2 ) -- local args = {} args.distance = dist args.lastdistance = lastDistance args.difference = abs( lastDistance - dist ) args.touch1 = touch1 args.touch2 = touch2 if lastDistance ~= -1 then if dist < lastDistance then --zoom out if OnZoomOut ~= nil then OnZoomOut( args ) end else --zoom in if OnZoomIn ~= nil then OnZoomIn( args ) end end ret = true end --save the lastdistance lastDistance = dist end elseif event.phase == "ended" then --remove this touch from list touches[ event.id ] = nil lastDistance = -1 zoomObject.touching = false end return ret end ----------------------------------------------- -- properties ----------------------------------------------- function setZoomObject( obj ) zoomObject = obj zoomObject.touching = false -- register table listener zoomObject:addEventListener( "touch", on_touch ) end ----------------------------------------------- -- returns current zoom object ----------------------------------------------- function getZoomObject() return zoomObject end ----------------------------------------------- -- returns the number of current touches ----------------------------------------------- function getNrTouches() return CountDictionary(touches) end ----------------------------------------------- -- sets the zoomin event function ----------------------------------------------- function setOnZoomIn( event ) OnZoomIn = event end ----------------------------------------------- -- sets the zoomout event function ----------------------------------------------- function setOnZoomOut( event ) OnZoomOut = event end ----------------------------------------------- -- for the simulator: create a fictive touch ----------------------------------------------- function setFictiveSimulatorTouch( x, y) fictiveTouch.x = x; fictiveTouch.y = y touches[ fictiveTouch.id ] = fictiveTouch fictiveTouch.rect = display.newRect( fictiveTouch.x, fictiveTouch.y, 20, 20 ) end ----------------------------------------------- -- for the simulator: removes a fictive touch ----------------------------------------------- function removeFictiveSimulatorTouch() touches[ fictiveTouch.id ] = nil fictiveTouch.rect:removeSelf() end ----------------------------------------------- -- clean me ----------------------------------------------- function clean() zoomObject:removeEventListener( "touch", on_touch ) end
Abonați-vă la:
Postări (Atom)