如何使用 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 添加到应用程序中的大多数视图。的主要内容,如果未能解决你的问题,请参考以下文章

UIGesture 识别器,区分单击和双击。

UIScrollView 阻止我的 UIGesture 进行视图转换

UIGesture 在 IOS 中因未知原因失败

我们可以在cordova中识别UIGesture吗(在cordova中显示本地侧菜单的本机手势)

如何将 UIImage 旋转 90 度?

UIGesture 缩放与旋转手势