Для аналогичной проблемы я создал подкласс UIScrollView следующим образом: PoliteScrollView передает сенсорные сообщения своим подпредставлениям, когда он определяет, что они перетаскиваются.
@interface PoliteScrollView : UIScrollView
// number of pixels perpendicular to the scroll views orientation to make a drag start counting as a subview drag
// defaults to 1/10 of the scroll view's width or height, whichever is smaller
@property(nonatomic,assign) CGFloat subviewDraggingThreshold;
// yes when a subview is being dragged
@property(nonatomic,assign) BOOL isDraggingSubview;
// the subview being dragged
@property(nonatomic,strong) UIView *draggingSubview;
@end
@protocol PoliteScrollViewDelegate <NSObject>
@optional
- (void)scrollView:(PoliteScrollView *)scrollView subviewTouchesBegan:(NSSet *)touches;
- (void)scrollView:(PoliteScrollView *)scrollView subviewTouchesMoved:(NSSet *)touches;
- (void)scrollView:(PoliteScrollView *)scrollView subviewTouchesEnded:(NSSet *)touches;
@end
Основная идея проекта заключается в том, чтобы перетаскиватьвид прокрутки неоднозначен.Пользователь прокручивает или перетаскивает подпредставление?Представление PoliteScroll обрабатывает это, предоставляя две вещи: (1) понятие ориентации (горизонтальное, если оно длиннее его ширины, в противном случае вертикальное) и (2) пороговое расстояние для того, что представляет собой перетаскивание в направлении, перпендикулярном его ориентации.(по умолчанию 1/10 ширины или высоты).
Я вставил этот и несколько других файлов в вставку , содержащую следующее:
- PoliteScrollView .h и .m
- DraggableImageView.h и .m - это меняет свою позицию, когда он получает сенсорные сообщения.
- ViewController.m - что демонстрирует два в комбинации.
Чтобы объединить их в проекте, вставьте корзину для вставки в файлы с соответствующим именем, добавьте раскадровку с PoliteScrollView (не забудьте установить его делегат), добавьте несколько изображений (ViewController пытается добавить puppy0.jpeg в puppy4.jpeg.