最近我在我的应用程序中使用了故事板和xib。虽然这样做很容易将图像链接到正确的图像名称。现在我想在没有这些的情况下将它们链接起来并遇到麻烦。在这里搜索了很长一段时间并且谷歌没有取得太大成功。
这些图像将用于后应用程序启动闪屏,以防止白色闪光,(与IB完美配合)。在我的.h文件中,我做到了这一点。
@property (nonatomic, retain) UIImageView *splash4InchPortrait;
如何从我的应用中的图片声明图像名称,例如splash4InchPortrait@2x.png?
这就是我在两个文件中的含义。只是为了让你知道我在做什么。
·H
@interface CenterViewController : UIViewController <PullToRefreshViewDelegate, UIWebViewDelegate, UIGestureRecognizerDelegate, MTStatusBarOverlayDelegate, UIScrollViewDelegate>
{
UIWebView *webView;
NSTimer *timer;
UIScrollView *currentScrollView;
MTStatusBarOverlay *overlay;
}
@property(nonatomic) UIViewAutoresizing autoresizingMask;
@property(nonatomic) UIViewAutoresizing bounds;
@property (nonatomic, retain) UIImageView *splash35InchPortrait;
@property (nonatomic, retain) UIImageView *splash35InchLandscape;
@property (nonatomic, retain) UIImageView *splashRetina35InchPortrait;
@property (nonatomic, retain) UIImageView *splashRetina35InchLandscape;
@property (nonatomic, retain) UIImageView *splash4InchPortrait;
@property (nonatomic, retain) UIImageView *splash4InchLandscape;
@property (nonatomic, retain) UIImageView *splashPadPortrait;
@property (nonatomic, retain) UIImageView *splashPadLandscape;
@end
的.m
@interface UIViewController ()
@end
BOOL isPortraitView = YES;
@implementation CenterViewController
@synthesize splash35InchPortrait, splash35InchLandscape, splashRetina35InchPortrait, splashRetina35InchLandscape, splash4InchPortrait, splash4InchLandscape, splashPadPortrait, splashPadLandscape;
- (void)viewDidLoad
{
[super viewDidLoad];
webView = [[UIWebView alloc] initWithFrame:CGRectMake(0.f, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view setCenter:CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2)];
[(UIWebView*)webView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.mysite.com"]]];
webView.contentMode = UIViewContentModeScaleToFill;
webView.scalesPageToFit = YES;
webView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
[self.view addSubview:webView];
for (UIView* subView in webView.subviews) {
if ([subView isKindOfClass:[UIScrollView class]]) {
currentScrollView = (UIScrollView *)subView;
currentScrollView.delegate = (id) self;
}
}
webView.scrollView.scrollsToTop = YES;
[webView setDelegate:self];
webView.tag = 999;
timer = [NSTimer scheduledTimerWithTimeInterval:(1.0/1.0) target:self selector:@selector(tick) userInfo:nil repeats:YES];
[self.navigationController setNavigationBarHidden:YES];
[super viewDidLoad];
webView.contentMode = UIViewContentModeScaleAspectFit;
webView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
//get screen size
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if (UIDeviceOrientationIsPortrait(self.interfaceOrientation)){
//DO Portrait
if (screenBounds.size.height <=480) {
//code for 3.5-inch screen
splash35InchPortrait.hidden = NO;
splash35InchLandscape.hidden = YES;
splashRetina35InchPortrait.hidden = YES;
splashRetina35InchLandscape.hidden = YES;
splash4InchPortrait.hidden = YES;
splash4InchLandscape.hidden = YES;
splashPadLandscape.hidden = YES;
}else{
// code for 3.5 Retina inch screen
splash35InchLandscape.hidden = YES;
splashRetina35InchPortrait.hidden = NO;
splashRetina35InchLandscape.hidden = YES;
splash4InchLandscape.hidden = YES;
splashPadLandscape.hidden = YES;
}
}else{
// code for 4-inch screen
splash35InchPortrait.hidden = YES;
splashRetina35InchPortrait.hidden = YES;
splash4InchPortrait.hidden = NO;
splash4InchLandscape.hidden = YES;
splashPadLandscape.hidden = YES;
}
// Set up Pull to Refresh code
PullToRefreshView *pull = [[PullToRefreshView alloc] initWithScrollView:currentScrollView];
[pull setDelegate:self];
pull.tag = 998;
[currentScrollView addSubview:pull];
//Statusbar Overlay
overlay = [MTStatusBarOverlay sharedInstance];
overlay.delegate = self;
overlay.progress = 0.0;
webView.backgroundColor = [UIColor colorWithWhite:0.1f alpha:1.0f];
// Forward / Back Gestures
UISwipeGestureRecognizer *goForward = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightAction:)];
goForward.direction = UISwipeGestureRecognizerDirectionRight;
goForward.delegate = self;
goForward.numberOfTouchesRequired = 1;
[webView addGestureRecognizer:goForward];
UISwipeGestureRecognizer *goBack = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftAction:)];
goBack.direction = UISwipeGestureRecognizerDirectionLeft;
goBack.delegate = self;
goBack.numberOfTouchesRequired = 1;
[webView addGestureRecognizer:goBack];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return NO;
}
//Other Gestures
- (void)swipeLeftAction:(id)ignored{
[webView goBack];
[overlay postMessage:@"Go Back" duration:1 animated:YES];
}
- (void)swipeRightAction:(id)ignored{
[webView goForward];
[overlay postMessage:@"Go Forward" duration:1 animated:YES];
}
-(void)pullToRefreshViewShouldRefresh:(PullToRefreshView *)view {
[(UIWebView *)[self.view viewWithTag:999] reload];
[overlay postMessage:@"Reloading" duration:1 animated:YES];
}
//Webview Start/Finish Request
- (void)webViewDidStartLoad:(UIWebView *)webView {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webview {
#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)
bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));
if (isiPhone5) {
// Loading iPhone 5
[(PullToRefreshView *)[self.view viewWithTag:998] finishedLoading];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSLog(@"didFinish: %@; stillLoading:%@", [[webView request]URL],
(webView.loading?@"NO":@"YES"));
}
else if (IS_IPAD) {
// Loading IPAD
[(PullToRefreshView *)[self.view viewWithTag:998] finishedLoading];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSLog(@"didFinish: %@; stillLoading:%@", [[webView request]URL],
(webView.loading?@"NO":@"YES"));
}
else {
// Loading iPhone 3.5"
[(PullToRefreshView *)[self.view viewWithTag:998] finishedLoading];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSLog(@"didFinish: %@; stillLoading:%@", [[webView request]URL],
(webView.loading?@"NO":@"YES"));
}
}
//Rotation
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if(fromInterfaceOrientation == UIInterfaceOrientationPortrait){
[webView stringByEvaluatingJavaScriptFromString:@"rotate(0)"];
}
else{
[webView stringByEvaluatingJavaScriptFromString:@"rotate(1)"];
}
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
//Image animation
- (void)tick {
if (!webView.loading) {
[self performSelector:@selector(fadeimage) withObject:nil afterDelay:0.3];
}
}
-(void)fadeimage{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
splash35InchPortrait.alpha = 0;
splash35InchLandscape.alpha = 0;
splashRetina35InchPortrait.alpha = 0;
splashRetina35InchLandscape.alpha = 0;
splash4InchPortrait.alpha = 0;
splash4InchLandscape.alpha = 0;
splashPadLandscape.alpha = 0;
splashPadPortrait.alpha = 0;
[UIView commitAnimations];
}
- (void)viewDidUnload {
webView = nil;
[super viewDidUnload];
// Release any retained subviews of the main view.
}
@end
更新:
从我的旧项目合并代码和下面接受的答案中的代码(感谢kushyar)。我设法得到它。如果有人好奇,这就是我所做的。
//Setting Splash Images
#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)
bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));
if (isiPhone5) {
// Load iPhone 5 Splash
UIImage *splash4Inch = [UIImage imageNamed:@"Default-568h@2x.png"];
self.splash4InchPortrait = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, -20.0f, 320.0f, 568.0f)];
[self.splash4InchPortrait setImage:splash4Inch];
[self.view addSubview:self.splash4InchPortrait];
[self.view bringSubviewToFront:self.splash4InchPortrait];
self.splash4InchPortrait.contentMode = UIViewContentModeScaleToFill;
}
else if (IS_IPAD) {
// Load IPAD StoryBoard
UIImage *splashPad = [UIImage imageNamed:@"Default-Portrait~ipad.png"];
self.splashPadPortrait = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, -20.0f, 768.0f, 1024.0f)];
[self.splashPadPortrait setImage:splashPad];
[self.view addSubview:self.splashPadPortrait];
[self.view bringSubviewToFront:self.splashPadPortrait];
self.splashPadPortrait.contentMode = UIViewContentModeScaleToFill;
}
else {
// Load the iPhone 3.5" Splash
UIImage *splash35Inch = [UIImage imageNamed:@"Default.png"];
self.splash35InchPortrait = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, -20.0f, 320.0f, 480.0f)];
[self.splash35InchPortrait setImage:splash35Inch];
[self.view addSubview:self.splash35InchPortrait];
[self.view bringSubviewToFront:self.splash35InchPortrait];
self.splash35InchPortrait.contentMode = UIViewContentModeScaleToFill;
}
答案 0 :(得分:0)
首先创建一个UIImage
,然后将UIImageView
的图像属性设置为该图像,即可声明@ggrana指出的图像。
所以
UIImage *myImage = [UIImage imageNamed:@"splash4InchPortrait"];
[splash4InchPortrait setImage:myImage];
或
[splash4InchPortrait setImage:[UIImage imageNamed:@"splash4InchPortrait"]];
您还必须在- (void)loadView {}
方法中初始化您的UIImageView。
确保您设置了UIImageView
的框架,并将其添加为UIViewController
view
的子视图。
最后一点:当您按照上面的指示定义图像时,无需指定@2x
。编译器会根据它运行的设备为您执行此操作。
编辑:好的,尝试将其添加到您的实施文件中。
- (void)loadView {
[super loadView];
UIImage *myImage = [UIImage imageNamed:@"splash4InchPortrait@2x.png"];
self.splash4InchPortrait = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 568.0f)];
[self.splash4InchPortrait setImage:myImage];
[self.view addSubview:self.splash4InchPortrait];
[self.view bringSubviewToFront:self.splash4InchPortrait];
}
最后,如果您未在dealloc
方法中使用ARC,请务必发布图片。
- (void)dealloc {
[self.splash4InchPortrait release];
}
这应该让你开始走上坚实的道路。
答案 1 :(得分:0)
我建议您执行以下操作:
然后,您可以定义执行此操作的单个方法,而不是在所有这些组件上设置隐藏属性,并从控制器中调用它。
模型 - 视图 - 控制器模式的精神在于控制器是模型和视图之间的薄“粘合”层。其目的是在它们之间来回分流/翻译信息。
加载图片
注意:您只需要选择图像资源名称 - UIImage将选择正确的资源(@ 2x,568h @ 2x等)。
关于选择要使用的正确图像:如果使用Jetbrains的AppCode IDE,则可以执行以下操作:
在输入[UIImage imageNamed:@“”]后按Ctrl-空格键以获取可供选择的图像文件列表。
按住Ctrl键单击图像文件名,在IDE中渲染它,并显示大小,像素深度等。
(您可能也可以使用Xcode执行此操作 - 不知道,因为它不是我的主要IDE)。