Hi. I am developing an app and I would like to set the background in the app itself.
Now I created an array of buttons using a for loop and setting tags, but for some reason when I click the buttons nothing happens.
This is where the buttons are created:
-(void)showSettings {
[[objc_getClass("DreamBoard") sharedInstance] hideAllExcept:mainView];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.5];
if(toggled){
photos = [[NSArray arrayWithObjects:
[UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/Images/Wallpapers/Wallpaper1.png"],
[UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/Images/Wallpapers/Wallpaper2.png"],
[UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/Images/Wallpapers/Wallpaper3.png"],
[UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/Images/Wallpapers/Wallpaper4.png"],
nil] retain];
w=0;
for ( UIImage *image in photos )
{
for (l = 0; l<(int)photos.count; l++)
{
wallpaperButton = [[UIButton alloc] initWithFrame:CGRectMake(5,130+150*w,150,150)];
wallpaperButton.tag = l;
[wallpaperButton setImage:image forState:UIControlStateNormal];
[wallpaperButton addTarget:self action:#selector(setWallpaper) forControlEvents:UIControlEventTouchDown];
[settingsMenu addSubview: wallpaperButton];
[wallpaperButton release];
}
w++;
}
Here is the function to set the wallpaper:
-(void)setWallpaper {
UIImageView *bgView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
if ([wallpaperButton tag] == 1) {
bgView.image = [UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/Images/Wallpapers/Wallpaper1.png"];
}
else if ([wallpaperButton tag] == 0) {
bgView.image = [UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/Wallpapers/Wallpaper2.png"];
}
else if ([wallpaperButton tag] == 2) {
bgView.image = [UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/ Wallpapers/Wallpaper3.png"];
}
else if ([wallpaperButton tag] == 3) {
bgView.image = [UIImage imageWithContentsOfFile:#"/var/mobile/Library/iZoon/Wallpapers/Wallpaper4.png"];
}
[mainView insertSubview:bgView atIndex:0];
[bgView release];
}
Now the buttons display correctly but they don't do anything.
Any help is appreciated. Thanks.
Add an NSLog statement to see if the setWallpaper method is being called. If it is, then i think this might be a fix:
If you just add the images to your XCode Project, you can just get them by their name. Make sure you check the "copy files to project folder if needed" box when you drag the images into the project. Then to get the image you can just do this:
if ([wallpaperButton tag] == 1) {
bgView.image = [UIImage imageNamed:#"Wallpaper1.png"];
}
.
.
.
[self.view addSubview:bgView];
Also, you should be aware that unless your app is hiding the status bar (the one with the battery and clock) then your images should actually have a height of 460 because 20px are used up by that.
Related
Every time you click on the create button 4 rows of images are created. I'm using this technique for the game mastermind. When you click on the clear button every imageview has to be set to nil, but now only the last created 4 imageviews are set to nil. Any help would be appreciated!
- (IBAction)create {
_imgView1 = [[UIImageView alloc] initWithFrame:CGRectMake(134, y, 30, 30)];
_imgView2 = [[UIImageView alloc] initWithFrame:CGRectMake(170, y, 30, 30)];
_imgView3 = [[UIImageView alloc] initWithFrame:CGRectMake(206, y, 30, 30)];
_imgView4 = [[UIImageView alloc] initWithFrame:CGRectMake(241, y, 30, 30)];
_imgView1.image = [UIImage imageNamed:[textfield_code objectAtIndex:0]];
_imgView2.image = [UIImage imageNamed:[textfield_code objectAtIndex:1]];
_imgView3.image = [UIImage imageNamed:[textfield_code objectAtIndex:2]];
_imgView4.image = [UIImage imageNamed:[textfield_code objectAtIndex:3]];
[self.view addSubview:_imgView1];
[self.view addSubview:_imgView2];
[self.view addSubview:_imgView3];
[self.view addSubview:_imgView4];
y += 41;
}
- (IBAction)clear {
[_imgView1 setImage:nil];
[_imgView2 setImage:nil];
[_imgView3 setImage:nil];
[_imgView4 setImage:nil];
}
enumerate the view's subviews
for(UIImageView *v in self.view.subviews) {
if([v isKindOfClass:[UIImageView class]) {
[v setImage:nil];
}
}
BUT this is 'dangerous' as it removes ANY image view there is. it'd be better to use tags too.
e.g.
define it as #define MyTag 100
and when will creating v.tag = MyTag
and then in the loop check it if(v.tag == MyTag)
I Follow the comment and try to fix my problem,but still not working.
when i run the test demo on the simulator,i get this:
run the demo project view
and i click the test2, i want to change button title before clear the button title, but i
get this :
after i click test2 button
i can not clear the button title when click another button.
anyone can help ??
Here is my code
-(void)addbutton
{
for (int i=0; i<3; i++)
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake((i*100), 0, 100, 100)];
button.titleLabel.text = #"";
[button setTag:i];
[button setTitle:[self.demoDataArray objectAtIndex:i] forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
[button addTarget:self action:#selector(setButtonTitle:) forControlEvents:UIControlEventTouchUpInside];
[self.demoView addSubview:button];
}
}
-(IBAction)setButtonTitle:(id)sender
{
if ([sender tag] == 0)
{
self.demoDataArray = [[NSArray alloc] initWithObjects:#"test5", #"test6", #"test7", #"test8", nil];
[self addbutton];
}
else if([sender tag] == 1)
{
self.demoDataArray = [[NSArray alloc] initWithObjects:#"test9", #"test10", #"test11", #"test12", nil];
[self addbutton];
}
else if([sender tag] == 3)
{
self.demoDataArray = [[NSArray alloc]initWithObjects:#"test13", #"test14", #"test15", #"test16", nil];
[self addbutton];
}
}
Every time any button is pressed, you instantiate new buttons and add them on top of the other ones. You probably want to just update the existing buttons. Try this for your -addButton method instead:
-(void)addbutton
{
for (int i=0;i<3;i++)
{
NSInteger tag = i+1;
UIButton *button = (UIButton *)[self.view viewWithTag:tag];
if (!button)
{
button = [[UIButton alloc] initWithFrame:CGRectMake((i*100), 0, 100, 100)];
[button addTarget:self action:#selector(setButtonTitle:) forControlEvents:UIControlEventTouchUpInside];
[button setTag:tag];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
[self.demoView addSubview:button];
}
button.titleLabel.text = #""; // Not actually sure you need this...
NSString *titleText = nil;
if (i < self.demoDataArray.count)
titleText = [self.demoDataArray objectAtIndex:i];
[button setTitle:titleText forState:UIControlStateNormal];
}
}
Now the button is instantiated, given a target and action, tagged, and added into the button hierarchy only when it doesn't already exist. Every time a button is tapped after that, only the titles will be updated.
Also, very important:: in order for -viewWithTag: to work, you have to use a tag for your buttons that is not equal to 0, the default tag - otherwise the button's superview will be returned. This means you'll need to make the following changes in your button handler, which already had a bug with checking the tags (checking against 3 rather than 2). Increment the tags to start at 1 and end with 3 like so:
-(IBAction)setButtonTitle:(id)sender
{
if ([sender tag] == 1)
{
self.demoDataArray = [[NSArray alloc] initWithObjects:#"test5",#"test6",#"test7",#"test8", nil];
[self addbutton];
}
else if([sender tag] == 2)
{
self.demoDataArray = [[NSArray alloc] initWithObjects:#"test9",#"test10",#"test11",#"test12", nil];
[self addbutton];
}
else if([sender tag] == 3)
{
self.demoDataArray = [[NSArray alloc]initWithObjects:#"test13",#"test14",#"test15",#"test16", nil];
[self addbutton];
}
}
That method could use some cleanup as well to eliminate duplicated code and it's probably more appropriate to use a switch statement here anyways. But that's neither here nor there.
OK, this should probably get you up and running. I didn't test or compile this so if you do have some problem with the compiler that you're not able to work through on your own please let me know and I'll see if I can spot the issue.
try this
- (IBAction)firstbtn:(UIButton *)sender {
[secondbtn setTitle:#"" forState:UIControlStateNormal];
}
-(void)setButtons_AsPerTheMatrixSelection
{
for(UIView *subview in [viewWithButtons subviews])
{
if ([subview isKindOfClass:[UIButton class]])
{
[subview removeFromSuperview];
}
}
viewWithButtons = [[UIView alloc] init];
width = 48;
height = 48;
pw = 49;
ph = 49;
arrButton = [[NSMutableArray alloc] init];
UIImage *imgDefaultBG = [UIImage imageNamed:#"bg.jpg"];
viewWithButtons.frame = CGRectMake(50, 40, 200, 260);
ch = 4;
cv = 4;
for ( i = 0 ; i < cv ; ++i )
{
for ( j = 0 ; j < ch ; ++j )
{
btnMatrix = [[[UIButton alloc] initWithFrame:CGRectMake(10+pw*j, 51+ph*i, width, height)] autorelease];
btnMatrix.tag = i*ch+j;
btnMatrix.userInteractionEnabled = TRUE;
bulImageStatus = FALSE;
[btnMatrix addTarget:self action:#selector(changeImage:) forControlEvents:UIControlEventTouchDown];
[btnMatrix setBackgroundImage:imgDefaultBG forState:UIControlStateNormal];
[viewWithButtons addSubview:btnMatrix];
[arrButton addObject:btnMatrix];
}
}
NSLog(#"arrButton object count is:--> %d",[arrButton count]);
[self.view addSubview:viewWithButtons];
}
-(void)AddImageToArray
{
arr_FirstSet = [[NSMutableArray alloc] init];
NSString *strImageName;
if(appDelegate.intCategoryBtnTag == 0)
{
for (intimg = 1; intimg <= 28; intimg++)
{
strImageName = [NSString stringWithFormat:#"%d_1.png",intimg];
NSLog(#"strImageName is :--> %#",strImageName);
[arr_FirstSet addObject:strImageName];
}
NSLog(#"arr_FirstSet objects are...%#",arr_FirstSet);
}
}
-(void)changeImage:(id)sender
{
UIImage *img;
NSString *strImageName;
strImageName = [arr_FirstSet objectAtIndex:arc4random() % [arr_FirstSet count]/2];
NSLog(#"btnMatrix is:--> %#",strImageName);
img = [UIImage imageNamed:strImageName];
//[btnMatrix setImage:img forState:UIControlEventTouchDown];
NSLog(#"sender detail is:--> %#",sender);
[sender setBackgroundImage:img forState:UIControlStateHighlighted];
}
This is my code to set the dynamic buttons in "setButtons_AsPerTheMatrixSelection" method,
"AddImageToArray" method is used to add images from bundle to NSMutableArray (arr_FirstSet) one by one.
"changeImage" method is used to set the background of particular button.
I am able to set the images as background to the buttons randomly,
But the main problem is that i have to set fixed dynamic image to particular button.
right now on each click of particular button i am getting changed random image when i press it once, twice, thrice etc...
I have to set any particular image which is generated randomly in the "changeImage" to single button & rest to the other buttons single-single.
Then i have to check if two buttons have same background then these two buttons will be removed from the matrix.
Please guide me for the mistake i am doing & help me.
//Please replace this method
-(void)changeImage:(UIButton *)sender
{
UIImage *img;
NSString *strImageName;
strImageName = [arr_FirstSet objectAtIndex:arc4random() % [arr_FirstSet count]/2];
img = [UIImage imageNamed:strImageName];
//for the first time sender.imageView.image property will be null then only we set image to the button.
//For second click this condition fails and does not set the other image.
if(!sender.imageView.image)
{
[sender setImage:img forState:UIControlStateHighlighted];
[sender setImage:img forState:UIControlStateSelected];
}
// Calling a method to check if two images of buttons are same.
[self checkIfTwoImagesAreSame:sender];
}
//And Add this method
- (void)checkIfTwoImagesAreSameImageMaching:(UIButton *)sender
{
for(UIView *subview in [viewWithButtons subviews])
{
if ([subview isKindOfClass:[UIButton class]])
{
UIButton *btn = (UIButton *)subview;
// This condition is comparing clicked button image with all the buttons images of the viewWithButtons view if it isEqual:
if(sender.imageView.image && btn.imageView.image && [sender.imageView.image isEqual:btn.imageView.image])
{
// this is checking if the clicked button is not comparing with itself
if(btn.tag != sender.tag)
{
[btn removeFromSuperview];
[sender removeFromSuperview];
// OR
// btn.selected = YES;
// sender.selected = YES;
// OR
// btn.hidden = YES;
// sender.hidden = YES;
}
}
}
}
}
I want to change the image of the buttons of UIActionSheet, I have images for each button, and I want each button show the image I want. I searched the web I found a lot of answers but they didn't work.
Here is the initialization of the UIActionSheet
-(IBAction)showActionSheet:(id)sender {
UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:#"title" delegate:self cancelButtonTitle:#"Cancel Button" destructiveButtonTitle:nil otherButtonTitles:#"Other Button 1", #"Other Button 2", nil];
popupQuery.actionSheetStyle = UIActionSheetStyleDefault;
[popupQuery showInView:self.view];
[popupQuery release];
}
I create a subclass CustomActionSheet derived UIActionSheet, and implement a method called customizeGUI.
I use CustomActionSheet like UIActionSheet, except I must call method customizeGUI of subclass in willPresentActionSheet delegate:
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
if ([actionSheet isKindOfClass:[CustomActionSheet class]]) {
CustomActionSheet *sheet = (CustomActionSheet*)actionSheet;
[sheet customizeGUI];
}
}
(CustomActionSheet.m)
- (void)customizeGUI {
UIImageView *imgvwBackground = [[UIImageView alloc] initWithImage:[UIImage imageNamed:#"bg_actionsheet.png"]];
CGRect rect = self.bounds;
imgvwBackground.frame = rect;
[self insertSubview:imgvwBackground atIndex:0];
[imgvwBackground release];
int buttonIndex = 0;
UIImage *imgButtonDestructive = [UIImage imageNamed:#"btn_actionsheet_destructive.png"];
UIImage *imgButtonCancel = [UIImage imageNamed:#"btn_actionsheet_cancel.png"];
UIImage *imgButtonNormal = [UIImage imageNamed:#"btn_actionsheet_normal.png"];
for (UIView *sub in self.subviews) {
NSString *className = [NSString stringWithFormat:#"%#", [sub class]];
if ( ([className isEqualToString:#"UIThreePartButton"]) //iOS 4
|| ([className isEqualToString:#"UIAlertButton"]) ) { //iOS 5
rect = sub.frame;
sub.hidden = YES;
UIButton *btn = [[UIButton alloc] initWithFrame:rect];
UIImage *imgForButton = nil;
if (buttonIndex == self.cancelButtonIndex) {
imgForButton = imgButtonCancel;
}
else if (buttonIndex == self.destructiveButtonIndex) {
imgForButton = imgButtonDestructive;
}
else {
imgForButton = imgButtonNormal;
}
NSString *sTitle = [self buttonTitleAtIndex:buttonIndex];
btn.titleLabel.font = [UIFont boldSystemFontOfSize:19];
[btn setBackgroundImage:imgForButton forState:UIControlStateNormal];
[btn setTitle:sTitle forState:UIControlStateNormal];
btn.tag = buttonIndex;
[btn addTarget:self action:#selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn];
[btn release];
buttonIndex++;
}
}
}
- (void)buttonClicked:(id)sender {
UIButton *btn = sender;
if ([self.delegate respondsToSelector:#selector(actionSheet:clickedButtonAtIndex:)]) {
[self.delegate actionSheet:self clickedButtonAtIndex:btn.tag];
}
[self dismissWithClickedButtonIndex:btn.tag animated:YES];
}
Hope this way can help you and give you an idea to customize UIActionSheet
If you change these sizes, not only might you make your application less usable, but that may violate Apple's Human Interface Guidelines, leading to a rejection of your application when submitted.
Here is the example how to use UiActionsheet by Apple
Looks like you'll just have to create your own class. I'd look into subclassing either UIView or UIActionSheet. There are those PSD things around that you can get the images you'll need, pending copyright.
EDIT: If you do end up creating your own class, and its any good, consider uploading it to http://cocoacontrols.com/
I'm using an UIImageView and UIScrollView inside UIViewController to show images. Actual Size and Fit to Screen options available at the toolbar to let user switch between modes. While switching between modes I am getting EXEC_BAD_ACCESS error randomly. Randomly means I can switch to Actual Size mode to Fit to Screen modes copule of times. When I hit one of them randomly application crashes.
Here is the code that I am using if it wont help I may post the h and m files.
-(void)loadImage{
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:imgFilePath];
imageView.image = [UIImage imageWithData: [NSData dataWithContentsOfFile:filePath]];
imgLoaded = 1;
}
-(void)FitToScreen{
if(imgLoaded<1) [self loadImage];
if(currentState != STATE_IMGPLAYER_FULLSCREEN ){
currentState = STATE_IMGPLAYER_FULLSCREEN;
//[imageView setContentMode:UIViewContentModeCenter];
[imageView setContentMode:UIViewContentModeScaleToFill];
CGSize photoSize = imageView.frame.size;
[scrollView setContentSize:photoSize];
}
//
}
-(void)ActualSize{
if(currentState != STATE_IMGPLAYER_ACTUAL_SIZE){
currentState = STATE_IMGPLAYER_ACTUAL_SIZE;
[imageView setContentMode:UIViewContentModeTopLeft];
[scrollView setContentMode:UIViewContentModeCenter];
CGSize photoSize = [imageView.image size];
[scrollView setContentSize:photoSize];
}
}
-(IBAction)info_clicked:(id)sender
{
UIButton *button = (UIButton *)sender;
if ([button tag] == BTN_FIT2SIZE) {
[Button setEnabled:NO];
[Button2 setEnabled:YES];
[self ActualSize];
} else if ([button tag] == BTN_FIT2SCREEN) {
[Button setEnabled:YES];
[Button2 setEnabled:NO];
[self FitToScreen];
}
[button release];
}
Console Msg:
Program received signal: “EXC_BAD_ACCESS”.
Thanks for your help.
A first quick guess is that maybe you aren't retaining the imageView or its image? If you could post your stack trace and maybe the line where it crashes, it would be useful.