duminică, 5 februarie 2012

iCarousel monotouch binding code

Objective-c header 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 id dataSource;
  [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 );
  

 }
}


13 comentarii:

  1. I was going over the steps and I'm not able to get it working on mono. Can you please share your code base, including the binaries?
    Thanks in advance.
    Raghu

    RăspundețiȘtergere
    Răspunsuri
    1. http://www.filefactory.com/file/2v4xn9uk7eg7/n/iCarouselSharp_zip

      Ștergere
  2. Hello. Give me an email address where i can send what i have.

    RăspundețiȘtergere
  3. Hello! did you managed to implement it into Monotouch? Do you have an example of project?

    RăspundețiȘtergere
    Răspunsuri
    1. Da am reusit, l-am folosit chiar la vreo 10 proiecte pana acum. Am creat un proiect de testare pt monodevelop:
      http://www.filefactory.com/file/2v4xn9uk7eg7/n/iCarouselSharp_zip

      Ștergere
    2. Multumesc! Am reusit sa-l integrez si eu acum cateva saptamani. Nu stiam ca se dezvolta si in Romania pe asa ceva...

      Ștergere
  4. Can you upload it again? Because "this file is no longer available"

    Maybe github or similar

    Thanks!!!!!
    Greetings from Argentina
    HERNAN

    RăspundețiȘtergere
  5. Hello Hernan, try this link:
    http://www.filehosting.org/file/details/361582/iCarouselSharp.zip

    RăspundețiȘtergere
  6. Thank andreea, but it said "We are moving our data to new servers! The service is limited reachable until 24.07."
    Do you use skydrive o something like that?

    I'm making iCarousel.dll by myselft at https://hzaldivar@bitbucket.org/hzaldivar/icarousel.net.git but if you have a working copy it would be great!! beacause it's my first binding :P

    RăspundețiȘtergere
  7. download link on google drive: https://docs.google.com/open?id=0B3XlyJiVpNvWVEtiUFQ3Tkh6SkU

    RăspundețiȘtergere
  8. Thanks a lot Andreea!!!!! you were so kindly!

    Greetings from Argentina
    Hernan
    https://twitter.com/vackup
    https://www.facebook.com/acomicofzombies

    RăspundețiȘtergere
  9. I made it work with my code at https://hzaldivar@bitbucket.org/hzaldivar/icarousel.net.git and your sample!! lol!!! i was just missing the delegate and datasource class.

    I think they should be abstract (TestBindingGen said it!)

    RăspundețiȘtergere
  10. Glad it worked! I just added you on twitter by the way, maybe we can chat sometimes.

    RăspundețiȘtergere