Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как двигать и вращать UIImage одновременно

Помогите разобраться.


Есть персонаж. После нажатия на StartGame координатам объекта присваиваются начальные значения (X = Object.center.x;  Y = Object.center.y) и запускается таймер, который каждые 0.05 сек. выполняет метод Object.Moving. 

В нём вычисляются координаты объекта X и Y;

И таким образом задаётся движение персонажа:   Object.center = CGPointMake ((int)X , (int)Y);

Потом обращение к методу [self Object.Rotate];


В Object.Rotate:

Object.center = CGPointMake (Object.center.x, Object.center.y);

Object.transform = CGAffineTransformMakeRotation(angle);        // угол снимается со слайдера на экране


Если закомментировать Object.Rotate - движение персонажа происходит отлично. А с ним вращение (через слайдер на экране) происходит не относительно текущей точки центра объекта, а относительно начальной точки. То есть Объект уже в другом месте, но если дернуть слайдер - он появляетсяна стартовой позиции и вращается. Отпустишь слайдер - появляется там, где должен быть.

Как сделать чтобы вращение происходило относительно текущего центра объекта (UIImage)?


Заранее спасибо, жду ваших ответов.






Это сообщение отредактировал(а) SlavaMinsk - 2.4.2014, 17:16
Ответ:
Спасибо, я примерно так и сделал. Правда всё равно получилось не идеально.  При сдвиге слайдера влево и вправо (положительный и отрицательный угол) вращение происходит относительно разных точек.

Но это уже не так принципиально.

Появился ещё один серьезный вопрос: как получить событие столкновения. Если бы вьюшка не подвергалась трансформациям - всё было бы просто:


if (CGRectIntersectRect(Tank.frame, Wall.frame))

                 [self bounce];

Но после трансформаций свойство frame использовать не получится:




Здесь предлагается использовать  "bounds" - границы. Кто-нибудь знает как их использовать чтобы получить событие столкновения?

Это сообщение отредактировал(а) SlavaMinsk - 4.4.2014, 13:16
Вопрос: Как двигать и вращать UIImage одновременно

Помогите разобраться.


Есть персонаж. После нажатия на StartGame координатам объекта присваиваются начальные значения (X = Object.center.x;  Y = Object.center.y) и запускается таймер, который каждые 0.05 сек. выполняет метод Object.Moving. 

В нём вычисляются координаты объекта X и Y;

И таким образом задаётся движение персонажа:   Object.center = CGPointMake ((int)X , (int)Y);

Потом обращение к методу [self Object.Rotate];


В Object.Rotate:

Object.center = CGPointMake (Object.center.x, Object.center.y);

Object.transform = CGAffineTransformMakeRotation(angle);        // угол снимается со слайдера на экране


Если закомментировать Object.Rotate - движение персонажа происходит отлично. А с ним вращение (через слайдер на экране) происходит не относительно текущей точки центра объекта, а относительно начальной точки. То есть Объект уже в другом месте, но если дернуть слайдер - он появляетсяна стартовой позиции и вращается. Отпустишь слайдер - появляется там, где должен быть.

Как сделать чтобы вращение происходило относительно текущего центра объекта (UIImage)?


Заранее спасибо, жду ваших ответов.






Это сообщение отредактировал(а) SlavaMinsk - 2.4.2014, 17:16
Ответ:
нет, не знаю. Если бы знал, то уже написал бы.
Могу только предположить, что при вращении нужно отнимать от Х и Y какое-то значение, на которое смещается центр картинки относительно верхнего левого угла.
Если это квадрат, то возможно что эта величина может быть рассчитана как-то через синус, то есть delta = sin(angle) * radius. где радиус это половина ширины квадрата. Кроме того надо отбрасывать отрицательные величины, то есть delta = ABS(sin(angle) * radius). ну и напоследок угол для синуса скорее всего тоже надо увеличивать быстрее чем для поворота, например в два раза.
То есть финальная дельта delta = ABS(sin(angle * 2) * radius)

В итоге вы должны писать 
Код

double delta = ABS(sin(angle * 2) * radius);
CGAffineTransformMakeTranslation(X - delta, Y - delta);


Но это только теория, возможно что к практике оно не имеет никакого отношения

Это сообщение отредактировал(а) Bitter - 4.4.2014, 00:11
Вопрос: Сохранить компрессию UIImageJPEGRepresentation

Здравствуйте уважаемые форумчане!
Нашел код компрессии изображения, что приведен ниже.

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    func resized(withPercentage percentage: CGFloat) -> UIImage? {
        let canvasSize = CGSize(width: size.width * percentage, height: size.height * percentage)
        UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(origin: .zero, size: canvasSize))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
    
    func resizedTo1MB() -> UIImage? {
        guard let imageData = UIImageJPEGRepresentation(self, 1.0) else {return nil}
        
        var resizingImage = self
        var imageSizeKB = Double((imageData.count)) / 1000.0 // ! Or devide for 1024 if you need KB but not kB
        
        while imageSizeKB > 150 { // ! Or use 1024 if you need KB but not kB
            let resizedImage = resizingImage.resized(withPercentage: 0.9)
            let imageData = UIImageJPEGRepresentation(resizedImage!, 0.5)
            
            resizingImage = resizedImage!
            imageSizeKB = Double((imageData?.count)!) / 1000.0
            print("imageSizeKb = ", imageSizeKB)// ! Or devide for 1024 if you need KB but not kB
            print("resizingImage.width = ", resizingImage.size.width, ", resizingImage.height = ", resizingImage.size.height)
        }
        
        let compressionImageData = UIImageJPEGRepresentation(resizingImage, 0.5)
        return UIImage(data: compressionImageData!)
    }
}
Дело в том, что цикл перестает работать, когда изображение сожмется до 150 кб. В логах отчетливо видно, что цикл прекращается именно в этот момент! Изображение весит <150 кб., ширина: >1000 px, длинна: >1100 px.

Objective-C
1
2
3
4
5
6
7
8
9
10
11
for element in self.imgArray{
                let oldImage = element
                let imageData =  Data(UIImageJPEGRepresentation(oldImage, 1.0)!)
                let newImage = UIImage(data: imageData)
                let resizedImage = newImage?.resizedTo1MB()
                print("resizedImage: do something with image")
                let dataResizedImage = UIImagePNGRepresentation(resizedImage!)
                print("imageData = ", Double((imageData.count)) / 1000.0)
                print("dataResizedImage = ", Double((dataResizedImage?.count)!) / 1000.0)
                newImgArray.append(/*compressImageWhatsApp(image: newImage!)*/resizedImage!)
            }
Но дело в том, что когда я возвращаю изображение, то в исходном коде в верху видно, что при передаче на сервер(переменная dataResizedImage) оно весит больше 1500 кб. Я не могу понять с чем это связанно, если кто знает, как исправить эту ситуацию буду очень благодарен!
Ответ: jr_, там объяснение есть, почему 1000, а не 1024

Добавлено через 2 часа 33 минуты
jr_, и вообще, нечего написать не пишите!
Вопрос: Как оптимизировать код objective-c?

я не могу винести загрузку в метод viewDidLoad. Знаю что вопрос глупый, но я всё перепробовал и картинки не выводит. :dash1  Помогите пожалуйста. Вот код из ячейки таблицы:
Код

NSString *filePath1 = [NSString stringWithFormat:@"%@",responsePhotos[0]];
NSURL *imgurl=[NSURL URLWithString:filePath1];
dispatch_queue_t queue =     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
   NSData *dataimage1 = [NSData dataWithContentsOfURL:imgurl];
   UIImage *imim1 = [UIImage imageWithData:dataimage1];
    dispatch_async(dispatch_get_main_queue(), ^{
        if (imim1==nil) {
            cell.imgauto1.image=[UIImage imageNamed:@"camera_a.gif"];
        }else{
            cell.imgauto1.image=imim1;
        }
    });
});

Ответ:
Спасибо, за Ваш совет. Можете помочь с этим: В методе viewDidLoad я должен загрузить часть изображений, и уже передать их скачанные в ячейку, и назначить. Почему часть, потому что качать например 100 картинок, это значит что пользователь будет все это время ждать их загрузки, хочу использовать infinityscroll и pulltorefresh, принцип такой:дойдя до конца таблицы, 10 ячейки, например, начну загрузку еще 10 штук, и потом обновлю таблицу. для кеширование хочу использовать SDWebImageCash. У меня не получаеться это реализовать. Мне б хоть какой-то пример как это реализовано.
Вопрос: Как оптимизировать код objective-c?

я не могу винести загрузку в метод viewDidLoad. Знаю что вопрос глупый, но я всё перепробовал и картинки не выводит. :dash1  Помогите пожалуйста. Вот код из ячейки таблицы:
Код

NSString *filePath1 = [NSString stringWithFormat:@"%@",responsePhotos[0]];
NSURL *imgurl=[NSURL URLWithString:filePath1];
dispatch_queue_t queue =     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
   NSData *dataimage1 = [NSData dataWithContentsOfURL:imgurl];
   UIImage *imim1 = [UIImage imageWithData:dataimage1];
    dispatch_async(dispatch_get_main_queue(), ^{
        if (imim1==nil) {
            cell.imgauto1.image=[UIImage imageNamed:@"camera_a.gif"];
        }else{
            cell.imgauto1.image=imim1;
        }
    });
});

Ответ:
Спасибо, за Ваш совет. Можете помочь с этим: В методе viewDidLoad я должен загрузить часть изображений, и уже передать их скачанные в ячейку, и назначить. Почему часть, потому что качать например 100 картинок, это значит что пользователь будет все это время ждать их загрузки, хочу использовать infinityscroll и pulltorefresh, принцип такой:дойдя до конца таблицы, 10 ячейки, например, начну загрузку еще 10 штук, и потом обновлю таблицу. для кеширование хочу использовать SDWebImageCash. У меня не получаеться это реализовать. Мне б хоть какой-то пример как это реализовано.
Вопрос: Прогрузка и ленивая загрузка UIView перед доба...

Есть желание показать UIView c тяжелой картинкой. Я пытаюсь сделать такую загрузку, которая позволит остальной программке работать

Класс этой вью
Код

- (id)initWithSpinset:(NSString*)spinset withSize:(CGSize)size {
    self = [super initWithFrame:(CGRect){0, 0, size}];
    if (!self) return nil;
    
    self.clipsToBounds = YES;
    
    [NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:spinset];
    
    return self;
}

- (void)loadImage:(NSString*)spinset {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:spinset ofType:nil];
    NSData *imageData = [[NSData alloc] initWithContentsOfFile:filePath];
    UIImage *spinsetImage = [[UIImage alloc] initWithData:imageData];
    if (!spinsetImage) return;
    
    _spinsetImageView = [[UIImageView alloc] initWithImage:spinsetImage];
    if (_spinsetImageViewPosition)
        _spinsetImageView.frame = CGRectOffset(_spinsetImageView.frame, 0, _spinsetImageViewPosition);
    [self addSubview:_spinsetImageView];
    
    self.isReady = YES;
}


Потом, в другом месте, создаю экземпляр вышеприведенного класса и по KVO слежу за свойством isReady. По isReady == YES добавляю вью на главную вью и там еще всякого делаю.

Проблема в том, что isReady срабатывает очень быстро. Т.е. это не решает задачу предварительной прогрузки UIView. Подскажите где моя ошибка и как логично решать такую задачу.

Это сообщение отредактировал(а) Shklyar - 28.2.2014, 13:30
Ответ:
ну создание UI не может занимать много времени, может много времени занимает что-то другое? Например загрузка картинок или наполнение массивов
Вопрос: Загрузка изображений на сервер с Alamofire

Здравствуйте уважаемые форумчане!
Возникла следующая проблема, дело в том, что иногда не выгружаются изображения на сервер. Все данные корректны, изображение присутствует, переменные расставлены в правильном порядке, функция сообщает о успешной выгрузке, но изображения на сервер иногда все равно не доходят. С библиотекой Retorfit таких проблем нет, а вот с Alamofire часто возникает. Не могу пока разобраться почему.

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class func write_photo(params:[String:String],image:UIImage, in_position:String, completion:_ js:String, _ success:Bool -> Void, failure:_ errorMessage:String,_ failure:Bool -> Void) {
let url = BaseURL + "xdb_items.write_photo"
let URL = try! URLRequest(url: url, method: .post)
let in_idclient = params["in_idclient"]
let in_iditem = params["in_iditem"]
let imgData = UIImageJPEGRepresentation(image, 0.5)!
sessionManagerImage.upload(multipartFormData: { multipartFormData in
multipartFormData.append((in_idclient?.data(using: String.Encoding.utf8)!)!, withName: "in_idclient")
multipartFormData.append((in_iditem?.data(using: String.Encoding.utf8)!)!, withName: "in_iditem")
multipartFormData.append(imgData, withName: "in_filename", fileName: "photo", mimeType: "image/png")
multipartFormData.append((in_position.data(using: String.Encoding.utf8)!), withName: "in_position")
}, with: URL, encodingCompletion: {
encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.response { response in
completion("", true)
}
case .failure(let encodingError):
print("ERROR RESPONSE: \(encodingError)")
}
})
}
Ответ: нашел ошибку, status code 500, из-за чего она может возникать?
Вопрос: Не поворачивается subview

Не понятная ситуация. В настройках задана поддержка всех ориентаций. Кручу главный экран, все поворачивается правильно. Если из главного экрана вызвать subview в портретной ориентации. Subview вызывается в также в портретной ориентации и его можно вращать. Если вызвать из главного экрана subview в альбомной ориентации, то subview вызывается все равно в портретной ориетации???
Ответ:
Я разве хамлю? Я просто пытался направить на путь истинный. Так что не обижайтесь, но индусы иногда действительно пишут вот так как вы показали, и это очень печально, особенно когда заказчик дает проект и говорит исправить

Это сообщение отредактировал(а) Bitter - 4.12.2013, 11:22
Вопрос: NSInteger vs. int...

NSInteger и int: в чём разница и что где лучше применять?

В чём смысл наличия одновременно int и NSInteger?  Только совместимость с С, или же есть какой-то подвох?
Ответ:
int и NSInteger в IOS - одинаковые типы. Как уже сказал Maksys, это видно из объявления типа. А вот в MAC OS X действительно разные. 
Вопрос: Большие таблици на iPhone iPad

Привет всем) друзья у меня есть задача показать большую таблицу (связано с финансами) на iPhone iPad...
Она должна быть юзерфрендли и одновременно по возможности не уступать по функционалу!
Подскажите пож. как сотворить это дело) можно даже просто мысли нащет таких таблиц.
СПС всем...
Ответ: Artur_999, Можете сделать эти "столбики" скроллируемыми.