如何使用 UIGesture 将 UIImage 添加到应用程序中的大多数视图。
Posted
技术标签:
【中文标题】如何使用 UIGesture 将 UIImage 添加到应用程序中的大多数视图。【英文标题】:How to add a UIImage with UIGesture to most views in an application. 【发布时间】:2013-01-07 13:47:02 【问题描述】:我想在我的应用中制作广告横幅。有点像 iAd 的。
我打算通过在视图上放置一个 UIImage 然后分配横幅图像来实现它。然后我会添加一个触摸手势,以便用户可以单击它并转到我的应用程序中的另一个视图。我知道我可以很容易地在一个视图上执行此操作,但我希望它出现在应用程序中的大多数视图上。将横幅添加到多个视图而无需多次编写相同代码的最佳方法是什么?
下面的设计显示了我之后的那种横幅。
谢谢
【问题讨论】:
创建自定义的uiimage类 试试这个:raywenderlich.com/1768/… 创建自定义类并将子视图添加到每个视图 【参考方案1】:#import <UIKit/UIKit.h>
@class custom;
@protocol adDelegate
- (void)viewAd:(NSString *)adRate;
@end
@interface custom : UIView
@property (strong, nonatomic) UIImage *viewImage;
@property (assign) id <adDelegate> delegate;
@end
// 主类
#import "custom.h"
@implementation custom
@synthesize viewImage;
@synthesize delegate;
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = viewImage;
[self addSubview:imageView];
return self;
- (id)initWithCoder:(NSCoder *)aDecoder
if ((self = [super initWithCoder:aDecoder]))
return self;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
[self.delegate viewAd:@"view"];
【讨论】:
【参考方案2】:例如,您可以创建一个 UIView 类并将其命名为 BannerView。 // 在bannerView.h中
#import <UIKit/UIKit.h>
@interface BannerView : UIView
UIImageView* bannerImage;
@property(nonatomic,retain) UIImageView* bannerImage;
@end
//在bannerView.m中
#import "BannerView.h"
@implementation BannerView
@synthesize bannerImage;
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
// Initialization code
return self;
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
// Drawing code
bannerImage=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"banner-image.png"]];
bannerImage.frame=CGRectMake(0, 0, 320, 100);
[self addSubview:bannerImage];
// add a uibutton on top of the uiimageview and assign an action for it
// better than creating an action recogniser
UIButton* actionButton=[UIButton buttonWithType:UIButtonTypeCustom];
actionButton.frame=CGRectMake(0, 0, 320, 100);
[actionButton addTarget:self action:@selector(yourAction) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:actionButton];
-(void) yourAction
// do what ever here like going to an other uiviewController as you mentionned
@end
现在您可以通过这种方式从任何视图控制器调用此视图
BannerView* banner=[[BannerView alloc] initWithFrame:CGRectMake(0, 300, 320, 100)];
[self.view addSubview:banner];
【讨论】:
【参考方案3】:尝试从 UIView 创建一个父类,您可以在其中使用 UIImageView 和手势识别器执行横幅的所有显示和处理。然后,无论哪个视图需要此功能,都从该父类派生它们,并覆盖方法中的默认处理,以便您可以自定义子类中的行为。
【讨论】:
【参考方案4】:一些建议:
首先,为什么不直接使用UIButton
而不是UIImage
与手势?毕竟你真正在做的只是复制按钮功能......
其次,我可能会通过创建一个包含 UIButton 的类来解决整体问题,如下所示:
@interface YourSuperViewController : UIViewController
@property (nonatomic, strong) IBOutlet UIButton *adButton;
- (IBAction)adTouched:(id)sender;
@end
在此类的viewDidLoad
中,创建按钮并将其添加到视图中,并将您的广告特定逻辑添加到adTouched
操作中。
然后在您的应用中创建其余视图作为YourSuperViewController
的实例。像这样:
@interface SomeOtherViewController : YourSuperViewController
现在SomeOtherViewController
将自动神奇地拥有广告按钮并正确响应触摸它。完成!
【讨论】:
【参考方案5】:其他人都说的是最好的方法。如果您需要自定义功能,子类化可能是要走的路。
我只是想添加一个迂腐的东西。重要的是要记住 UIImage 不是视图。屏幕上从未出现过 UIImage。 UIImage 是一个模型对象。它只是数据的集合。 UIImageView 是一个视图对象,因此,UIImageView 可以在屏幕上显示自己。
这可能看起来过于迂腐和吹毛求疵,但为了有效地使用 MVC(模型、视图、控制器),将这些事情整理在我们的脑海中很重要
【讨论】:
以上是关于如何使用 UIGesture 将 UIImage 添加到应用程序中的大多数视图。的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 阻止我的 UIGesture 进行视图转换