objective-cで困っています教えてください
objective-cをトライ&エラーで試しながら学習をしている初心者です。タッチした所を中心にまず100×100の正方形を表示し、その後スライダーで正方形の大きさを決めてから画像のトリミングをしたいのですが、正方形が表示されないのと、タッチした位置と切り取られる位置がずれています。上記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。宜しくお願いします。
ViewController.mの内容
#import "ViewController.h"
@interface ViewController (){
//
UILabel *label;
//
UIImageView *uv;
//中心の位置
float v;
// X座標
float x;
// Y座標
float y;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//写真の表示
CGRect rect_uv = CGRectMake(0,20, 360, 360);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv];
//画像のアスペクト比を維持しUIImageViewサイズに収まるように表示
imageView.contentMode = UIViewContentModeScaleAspectFit;
UIImage *image = [UIImage imageNamed:@"hoge.png"];
[imageView setImage:image];
[self.view addSubview:imageView];
// UISliderのインスタンス化
CGRect rect_sd = CGRectMake(50, 400, 200, 10);
UISlider *slider = [[UISlider alloc]initWithFrame:rect_sd];
// スライダーの最小値,最大値,値を設定
slider.minimumValue = 0;
slider.maximumValue = 500;
slider.value = 100;
// スライドしている最中に値を調べられるようにする.デフォルトでYESだがサンプルのため
slider.continuous = YES;
// スライダーの値が変更されたときに呼ばれるメソッドを設定
[slider addTarget:self
action:@selector(slider_ValueChanged:)
forControlEvents:UIControlEventValueChanged];
// スライダーをビューに追加
[self.view addSubview:slider];
// ラベルの設置
CGRect rect_lb = CGRectMake(300, 400, 100, 30);
label = [[UILabel alloc]initWithFrame:rect_lb];
[self.view addSubview:label];
// 標準ボタン例文
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(50, 450, 100, 30);
[btn setTitle:@"切り取り" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(trim:)
forControlEvents:UIControlEventTouchDown];
[self.view addSubview:btn];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/**
* スライダーの値が変更されたとき
*/
- (void)slider_ValueChanged:(id)sender
{
UISlider *slider = sender;
// スライダーの値をログに記述
NSLog(@"スライダーの値:%f", slider.value);
// ラベルのテキストを設定
//float v = slider.value;
v = slider.value;
label.text = [NSString stringWithFormat:@"%2.f",v];
//四角形を描画
CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得
CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画
}
/**
* タッチされたとき
*/
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// 1.anyObjectメソッドでいずれか1つのタッチを取得
// 2.locationViewメソッドで対象となるビューのタッチした座標を取得
CGPoint p = [[touches anyObject] locationInView:self.view];
x = p.x; // X座標
y = p.y; // Y座標
NSLog(@"タップ開始 %f, %f", x, y);
//四角形を描画
CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得
CGContextStrokeRect(context, CGRectMake(x,y,100,100)); // 四角形の描画
}
/**
* 切り取りボタンが押されたとき呼ばれるtrimメソッド
*/
-(void)trim:(UIButton*)button{
// ここに何かの処理を記述する
// (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます)
// 切り抜き元となる画像を用意する。
//UIImage *srcImage = /* UIImagePickerなどから取得したUIImage */
UIImage *srcImage = [UIImage imageNamed:@"hoge.png"];
// 切り抜く位置を指定するCGRectを作成する。
CGRect trimArea = CGRectMake(x, y, v, v);
// CoreGraphicsの機能を用いて、
// 切り抜いた画像を作成する。
CGImageRef srcImageRef = [srcImage CGImage];
CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea);
UIImage *trimmedImage = [UIImage imageWithCGImage:trimmedImageRef];
// 画像表示例文
//UIImage *img = [UIImage imageNamed:@"hoge.png"];
UIImageView *iv = [[UIImageView alloc] initWithImage:trimmedImage];
[self.view addSubview:iv];
}
@end
お礼
お早いご回答有難うございました。 なるほど、ファイル名についてはNSStringをそのまま埋め込む形で導入出来るんですね。お蔭様で想定通りの組み込みが出来ました。 大きな疑問が解決して、今夜はよく眠れそうです。(笑)