xCode #if #define iphone型号

时间:2015-04-15 16:10:54

标签: ios iphone xcode cgrectmake

在xcode项目中,我使用(在.m文件中)

#define embedRectIphone CGRectMake(0, 0, 320, 180)

在早期版本中这很好。

但是现在这应该是不同的,因为iPhone有很多尺寸所以我需要像

这样的东西

.h文件看起来像:

#import <UIKit/UIKit.h>

@interface WebcamsDetailViewController : GAITrackedViewController <VideoPlayerDelegate> {

    VideoPlayerKit *videoPlayer;
    NSMutableArray *viewControllers;
    CGRect embedViewRect;

}

@end

然后,我调用我的元素(嵌入式自定义视频播放器)(在.m文件中)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        embedViewRect = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) ? embedRectIphone : embedRectIpad;
    }
    return self;

}

它似乎不适用于模拟器。 这可能吗?我错了吗? 关于如何解决此问题的任何其他想法?

在下面的一些帮助之后,.m文件看起来像:

    #import "WebcamsDetailViewController.h"
    #import "AppDelegate.h"
    #import "Webcam.h"

    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

#define embedRectIphone IS_IPHONE_6? CGRectMake(0, 0, 377, 210):CGRectMake(0, 0, 320, 180)

    #define embedRectIpad CGRectMake(0, 0, 768, 400)

    @interface WebcamsDetailViewController ()

    @end


    @implementation WebcamsDetailViewController

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            embedViewRect = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) ? embedRectIphone : embedRectIpad;
        }
        return self;

    }

    ...

    @end

希望得到答案, 最好的祝福, 大卫

2 个答案:

答案 0 :(得分:0)

Donn不依赖于这些&#34; TARGET_DEVICE_IPHONE_6&#34;宏。试试这样。

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

然后

#define embedRectIphone IS_IPHONE_6? CGRectMake(0, 0, 377, 210):CGRectMake(0, 0, 320, 180)

答案 1 :(得分:0)

这是完全错误的。这样做,使用#define,您将 获取适用于iPhone 4的应用程序,适用于iPhone 5的应用程序适用于iPhone 6等的应用程序。您将无法获得适用于所有内容的应用程序。包括Apple明年发布的iPhone7 + c。

使用像你这样的硬编码矩形真是太可怕了。你应该真正阅读像NSLayoutConstraint这样的东西,以获得适合各地的东西。看看Interface Builder为您提供的服务。只需构建一个您选择“新项目”时获得的示例程序;它们可以自动处理多个不同尺寸的设备,您也可以。